《程式設計的本質》 第二章

2021-06-20 16:17:30 字數 1131 閱讀 2866

程式設計的本質第二章看得也有點稀里糊塗,現在將自己的理解寫出來,只是為了以後自己在回憶的時候有個學習。

第二章的主要內容將transformation,中文意思是變換的意思。即現在有個操作f,對於變數x,f(x)就是在x上變換。如果f(x)的值域仍然在x的域中,那麼這樣的變換就可以持續進行。這樣存在三種情況:

1.  f...(f(x))一直重複下去,永遠不出現重複,那麼這個就是infinite。

2.  f...(f(x))重複到某個點以後,返回之前路徑上的某個點,那麼這個形狀是乙個線連線乙個圓。

3.  f...(f(x))就是乙個圓。

當路徑中存在圓的時候,本章解決乙個問題就是如何發現這個圓的入點(如果就是乙個圓,那麼任何乙個點都是入點,connection point)。這個問題主要有兩種解法:

1.  快慢指標的方法,如果路徑中存在圓,那麼用兩個指標遍歷這個圓,乙個每次遞進一步,乙個每次遞進兩步,這樣快指標會趕上慢指標,這樣就證明這個鏈路存在環,負責快指標會先到達這個鏈路的終點。複雜度為o(3n)

template requires(transformation (f))

domain(f)

collision_point_nonterminating_orbit(const domain(f)& x, f f)

return fast;

}

2.  採用hash的方法,將已經遍歷過的點,進行hash儲存,這樣時間複雜度為o(nlogn),但是空間複雜度為o(n)。

第二種方法複雜度較低,但是存在乙個缺點:實際中,可能沒有足夠的空間來訪問這些點。如果環特別大,這個演算法不是現實。這個演算法的時間複雜度很好,只有o(n)。robert sedgewick發明一種演算法,空間複雜度是m,時間複雜度是n(1+θ(1/sqrt(m))。

演算法的分析如下:每b個存到陣列裡,每個gb前面0~b個元素檢測是否已經存在。具體的內容大家可以看看它的文章

3.  第二章中還講解了如何找到環的入口問題。其實這個問題在《程式設計之美》或者《劍指offer》當中有,感興趣的讀者可以看看《程式設計之美》或者《劍指offer》這篇文章中的解釋。

本文完

T SQL第二章 程式設計

1 區域性產量的宣告 關鍵字declare 變數名 資料型別 例如 declare name varchar 10 2 賦值 輸出 賦值有兩種方法 1 set 變數名 要賦的值 2 select 變數名 要賦的值 輸出也有兩種方法 1 select 變數名 以 的形式輸出結果 2 print 變數名...

第二章 T SQL程式設計

go 批處理 遇到問題繼續執行go以後的語句 可以使不在同一批次處理語句中的sql語句不受影響 把相互聯絡的放在同一批次,沒聯絡的放在不同批次 變數分類 分為區域性變數和全域性變數 區域性變數 先宣告再複製 區域性有效 全域性變數 系統定義與維護,唯讀,不能修改 整個sql都可訪問或除錯 例 建立 ...

第二章程式設計題

庫函式標頭檔案包含 include include include 函式狀態碼定義 define true 1 define false 0 define ok 1 define error 0 define infeasible 1 define overflow 2 typedef int st...