《演算法導論》雖然是一本劃時代的經典演算法書籍,但難免有一些現代演算法未在其中記載。你知道哪些這樣的演算法?你是怎麼實現的?


CLRS並不是「演算法百科」,其目的是教授本科生和研究生的演算法課。另外的一些課,諸如OS, Compiler, Database, machine learning的演算法都鮮有涉及。

PS. 介紹一本真-演算法百科,1600刀,上面的演算法都是按照alphabet order排序的,有很多CLRS沒有的很高深的演算法……


就算是經典演算法,大家也研究了60年了,演算法導論裡面一共就只有那麼一些演算法,冰山一角都算不算呀。

演算法導論實質上是MIT本科生演算法課的講義,那門課的名字就叫Introduction to Algorithms,只是後來整理出書了。不是本科生第一門演算法課的內容,大多數都是沒有在這本書裏介紹的。

要舉例子的話,隨便找國外一門研究生演算法課,裡面大多數演算法應該都和本科的演算法課不一樣吧,否則就講了兩遍了。另外非經典組合演算法也很少出現在這門課中,經典演算法的並行和一些I/O優化也沒有出現。


多了去了。。。

1 帶並行/分散式的演算法,Lynch阿姨的書,Herlihy和Shavit的《多處理器編程藝術》logical clock,vector clock,atomic snapshot,分散式鎖,共識:paxos,raft(包括相應的multi版本),一致性hashlinearizable,seq-cst,memory order,consensus number,atomic register hierarchy,universal construction,鎖:Dekker/Petterson/Lamport,鏈式鎖,自選鎖(和不同的step-back策略),睡眠鎖/mutex(當然這個和調度器有關了,說到調度器又一堆方法/策略),fast-path,混合策略。並發:單鏈表,雙鏈表,deque,stack,skip list,hashmap(若干演算法),並發b-tree或其他平衡樹。rcu/hazard pointer或gc演算法(一堆)。

資料庫應該還有一些mvcc,2PC/3pc,plan,運算元下推,查詢器優化之類的,我不瞭解就不多說了。

2 parsing有關的演算法,《parsing techniques》挺厚的。

3 編譯器裏的演算法,dominator tree相關的,ssa相關的,gvn/pre/scev等scalar優化,指針分析,數據流/控制流分析,圖的2,3連通性,如何分解為不同的component,寄存器分配演算法,instruction selection演算法,loop transformation,poly-hydra compilation,presburg formulas。函數式的,cps變換,closure conversion,hygienic macro expansion用到的演算法,類型推斷演算法Hindley-Milner,還有prolog,minikanren之類的系統裏用到的演算法。形式化方法(Coq/Isabella/tla+)之類的,abstract interpretation之類的我不瞭解不說了。

4 數值相關的演算法,插值,迭代解矩陣,數值解線性/非線性偏微分,常微分方程,數值積分/微分,krylov子空間方法。

5 加密/解密/哈希演算法一堆。

6 Nagel演算法,delayed acknowledgement,

慢啟動,擁塞控制,快重傳,快恢復,tcp cubic,bbr之類的。

6 信號處理算演算法嗎?算的話那搞明白一堆離散/連續傅立葉/z/拉普拉斯/小波之類的變換纔算初窺門庭吧。

7 ML/DL我就不說了。

8 什麼馬拉車,balanced size tree,樹狀數組,線段數,ac自動機,Morris transversal之類常見但算導裏沒有的oi/ACM演算法就不說了。

9 introsort,rsync用的rolling hash。


算導中的演算法只是數學演算法中的冰山一角,多數是運籌學最實用部分的演算法,以及哈希和排序演算法,這只是多個數學學科中把最實用的拿出來。實際上直接刷算導是相當有相當大的難度的。而算導我第一章就刷不下去。到了後來才找到問題所在:我沒有足夠的數學基礎。

算導當中牽扯到的數學學科有數據結構基礎、數論、圖論、組合數學、計算幾何、運籌學、一點點線代一點點概率一點點數值計算,還有一點復變、級數的數值計算,可以說一個算導是大筐什麼都往裡裝。

因此可以說這本書不過是一本有關數學在計算機中可應用演算法的冰山一角。一般本科生刷完第五部分已經算足夠了,再往後,怕是本科的時間不太夠用。不是做不到,而是不夠用。從第六部分開始往後就開始直接牽扯大量的數學學科一般人怎麼可能刷的動。

如果想要在某個方向刷演算法,至少還有三四個方向可以讓你盡情刷:

數論、計算幾何、運籌學、數值分析。

其中運籌學最貼近計算機科學,當中的排隊論、線性規劃、動態規劃等都符合現在很多工業軟體和互聯網軟體的實用要求,計算幾何最貼近幾何化數據查詢,比如地圖、公交地鐵線路、資料庫組合查詢等等,數值分析最貼近科學計算、機器學習、音視頻和圖像演算法的要求。

這當中還沒有列舉任意一個機器學習演算法。

要想順利刷算導,在學一部分以上我所說的學科之前,可以說是相當困難的事情。

反正我第一部分就棄了,直接轉《數據結構和演算法分析》。

以上回答你也應該能意識到,算導只是冰山一角,在各種數學學科、管理規劃型學科中還有大量的演算法沒有納入其中,這只是一本多學科集中的一本介紹書而已。

這本書實際上你是不會學透的,牽扯大量學科,而每個學科的演算法只是給你介紹一點點,而每個被牽扯到的學科背後都是無窮盡的參天大樹,所以綜上所述,算導是幫你打好基礎以外,後面是長見識用的。所以勸入刷算導的,不如勸刷《數據結構》+ 任意一個感興趣的方向:

數據結構、演算法與應用 C++語言描述(原書第2版)京東去購買?

比如

《數據結構》+ 《計算幾何》,將來可以從底層開發資料庫系統以及地圖類系統的開發和研究;

計算幾何及應用京東去購買?

《數據結構》+ 《編譯原理》,將來從事編程語言設計和研究;

編譯原理(第3版)/清華大學計算機系列教材京東去購買?

《數據結構》 + 《數值分析》,將來可以從事科學計算軟體、工業計算軟體、無線通訊系統的設計、音視頻編碼和圖形圖像演算法方面的開發和研究;

數值分析 (第五版)+數值分析(第5版) 習題解答京東去購買?

《數據結構》+ 《運籌學》,操作系統底層開發或大型管理系統的設計;

運籌學(第二版)京東去購買?

《數據結構》+ 《機器學習》,將來從事機器學習方面的開發和研究;

《數據結構》+ 《數論》,將來從事密碼學方向的研究

……

看到最後不就是大學裡計算機專業分方向學習的一個做法嗎?人的精力有限,也不要想一口吃個大的,細分做精找到適合自己的研究或者工程方向才最OK。

另外說一個我們小學時期就學過的一個初等數論演算法,當然也包含在算導中:

歐幾裏得演算法。

演算法無處不在。

還有一門課是最推薦成為算導的先導課程:《離散數學》

離散數學及其應用(原書第8版·本科教學版)京東去購買?

設計演算法?別想了。學演算法是讓你選擇現有的演算法在合適的場景中應用,以解決現有遇到的問題。設計演算法那是聰明絕頂的人乾的事。是的,要聰明絕頂。你想絕頂?


演算法導論的英文是「introduction to algorithm」,也就是說演算法的介紹,不是演算法百科,要記錄所有演算法當然是不行的了

不過也正因為是基礎介紹,很多章節講的是原理和思路,比如貪心、dp之類的就不是演算法,而是思想,在章節和習題中用演算法當例子來講這類,所以就算碰到一個其沒有涉及到的某個演算法,也能感覺是在算導的覆蓋範圍內了

具體到其中沒有講到的演算法,隨便找個方向就能拎出一堆,比如排序演算法不止十幾種,算導貌似只講了其中幾個代表性的


推薦閱讀:
相關文章