《資料結構與演算法分析》5000字縮寫(下)

2021-05-10 08:32:38 字數 2160 閱讀 8480

p[x]表示元素x的父親的位置。一開始,p[x]都等於x自己,表示自己乙個人是乙個集合。函式find_set(x)將返回x所在集合(一棵樹)的根。

並查集還有些其它的剪枝和一些很複雜的效率分析問題,這裡不多說了。

寫到這裡,《資料結構與演算法分析》中的幾個大塊內容算是說清楚了。由於本文的敘述調整了原書各章節的順序且至此還沒有涉及書裡的一些小問題,因此這裡想把遺漏下的一些小東西提一下。

有一些樹結構可能要求同時滿足多個要求。比如乙個簡單的問題:如果要求構造乙個堆使得既能查詢最小元素又能查詢最大元素怎麼辦?這時,我們可以用乙個特殊的方法來實現:樹的單數層滿足一種性質,樹的雙數層滿足另一種性質。我們用乙個叫做最小-最大堆的東西來實現前面說的問題。這個堆的雙數層的資料小於它爸大於它爸的爸,單數層的資料反過來,大於它爸小於它爸的爸。用類似的方法,我們還可以設計乙個二叉查詢樹,使得它能夠支援含有2種不同型別元素的資料。在單數層按其中一種操作,在雙數層按另一種操作,這樣可以方便的查詢同時位於兩個不同類元素的指定區間內的資料。這種二叉查詢樹叫做2-d樹。擴充套件2-d 樹,我們可以得到k-d樹。這些資料結構的具體實現方法這裡不說了,書上本來也是作為乙個習題介紹的。

書裡的第7章花了近50頁介紹並分析各種排序演算法,分析得很全。其中第11節花了10頁介紹外部排序。所謂外部排序,就是說怎樣快速地把乙個根本無法全部讀入記憶體的大檔案進行排序。很多排序之所以可行是因為它們可以隨意讀寫任意乙個指定的數。但在大檔案裡,我們無法實現「第1234567890個元素和第 123個元素交換位置」,更無法實現遞迴之類的操作,而只能像磁帶一樣「過一遍」,從頭到尾掃一遍,由於檔案太大記憶體不能接受,因此必須要讀一截扔一截。於是,外部排序產生了。不要以為這個限制會把排序速度拖得很慢。事實上,外部排序同樣突破了o(n^2)的界限。它借助了歸併排序中的「合併兩個已經有序的陣列」的思想,因為這個操作可以邊讀就邊做。把檔案先拆成兩個檔案,再把每個檔案處理成一段一段的等長有序序列(一段多大取決於記憶體能一次處理多大),然後不斷從兩個檔案中各取一段出來合併。可以看到,每段有序序列的長度變長了,變成了2倍長。過不了幾次,這個長度將變成檔案的總長。注意,我們必須要讓每次合併時為下次合併做好準備(就是說合併後的結果仍然要是兩個分了段的檔案)。乙個好的方法是將合併的結果交替存在兩個不同的新檔案中。

第9章講圖論演算法。講了圖的遍歷(廣搜和深搜)、aov、aoe、dijkstra、網路流、prim、kruskal和np問題。在講深蒐時,我學到了兩個新東西,用線性時間查詢割點(去掉了的話圖就不連通了的點)和強分支(有向圖中的乙個分支滿足其中任兩個點之間都可以互相到達)。後來發現黑書上也有,又覺得這個東西很不好說,因此這裡不想說了。說到了黑書還想順便補一句:黑書真的看不得——太多錯誤了。不是說lrj怎麼了,lrj在真正的大問題上有他的思想和經驗,但很多細節的概念他也是昏的,這不利於初學者接受知識。不信哪天我還要寫一篇日誌糾正黑書的錯誤。引用政治書上抨擊「人性自私論」的經典語言:「從理論到實踐都是錯的」。

第10章講「演算法設計技巧」,大概是些貪心啊,分治啊,動規啊,回溯啊,隨機化啊之類的。排程問題、huffman樹、裝箱問題近似演算法、最近點距分治演算法、最優二叉查詢樹、floyd-warshall、跳躍表、miller-rabin素性測試、博弈演算法等都在這章中有講,並且講得相當好。由於這不是本書的重點內容,這裡也不說了。

第11章整章都在講攤還分析。這是乙個相當複雜的問題,是分析時間複雜度的乙個有力工具。它的分析告訴我們的不是某乙個操作的複雜度,而是重複執行某乙個操作的平均複雜度。研究這個是很有必要的,因為我們會遇到一些「越變越慢」的退化情形和「自我保持不變」的自調整性等資料結構,單個操作並不能反映它真正的效率。

到這裡,這本書的所有東西都已經介紹完了。總的來說,這本書很值得一看(雖然有些地方翻譯得很差)。它的理論性很強,證明過程完整(再複雜的分析它也證明得很清楚,滿足那些刨根問底的人);整本書自成乙個體系,前後呼應;習題具有研究性,與課文互相補充。事實上,這些都是國外教材共有的特點。這算是我完整讀過的第一本國外教材,今後我還會讀一些。這幾天在看《組合數學》(仍然是這個出版社出版的),看完後也打算寫一下「對《組合數學》一書中部分內容的形象理解」。讀一本國外教材,你會發現它與國內書籍的不同並會從中獲益更多。

這篇文章就寫到這裡了。號稱是乙個5000字縮寫,沒想到寫著寫著已經超過8000字了。而且,這個並不是縮寫,而是一些簡單的、系統的、清晰的、形象化的思想和理解。這篇文章或許對已經知道一些有關知識的人有用,但不適合一點也沒有接觸過資料結構與演算法分析的人。如果有乙個人能從中收穫一件東西,我寫這個的目的也就達到了。

(完)matrix67原創

做人要厚道 **請註明出處

《資料結構與演算法分析》5000字縮寫(中)

堆,就是一陀一陀的東西。頭重腳輕不算堆,要上面小下面大才算乙個堆。堆是一棵二叉樹,滿足下面的始終比上面的大。它和二叉查詢樹比較起來既有好的又有不好的 好的就是要想知道資料裡的最小值時根本就不用找了,直接就是最頂上的那個了 不好的就是堆除了這個以外基本上不能做別的事了。除了最頂上的那個以外,你幾乎沒辦...

資料結構與演算法分析

資料結構與演算法分析可以稱得上是程式設計師必須修煉的內功心法。資料的儲存結構 資料元素在計算機中的儲存方式 資料的操作集合 對一種資料型別的資料所有操作,例如對資料的增刪改查等等!演算法分析主要分析 下面是一些常用資料結構 一 線性表 1.陣列實現 2.鍊錶 二 棧與佇列 三 樹與二叉樹 1.樹2....

資料結構與演算法分析

資料結構 大量資料的組織方法 演算法分析 演算法執行時間的估算。涉及到計算效率。設想,如果能把時間限制從16年減至不到1秒,不很神奇嗎?在很多問題中,乙個重要的觀念是 寫出乙個可以工作的程式並不夠。如果這個程式在巨大的資料集上執行,執行時間就成了重要的 問題。演算法,是為求解乙個問題需要遵循的 被清...