《演算法導論》快速指南:我是如何10天入門演算法導論的。
01-24
知乎上總有一種聲音:
推薦閱讀:
如果你沒讀過CLRS/CSAPP/SICP,那麼你的CS生涯是不圓滿的。
註:
CLRS為《演算法導論》(鏈接:演算法導論(原書第3版) (豆瓣));CSAPP為《深入理解計算機系統》(鏈接:深入理解計算機系統 (豆瓣));
SICP為為《計算機程序的構造和解釋》(鏈接:計算機程序的構造和解釋 (豆瓣))。因為本人的興趣點在安全+大數據方向,CSAPP和SICP實在抽不出時間拜讀,只好看看CLRS了。
演算法與數據結構作為編程的基礎,在CS中的重要性不言而喻。我老師曾經說過學計算機好比學武功,編程語言算招式,演算法設計能力是內功。演算法實乃高手決勝負之地。於是萌生了看演算法導論的想法。個人基礎
本科課程學習過《數據結構》、《演算法分析》、《人工智慧》。資料準備網易公開課的演算法導論(麻省理工學院公開課:演算法導論_全23集_網易公開課):該課程是由Charles Leiserson(CLRS作者之一)、Erik Demaine兩人共同授課完成。Charles風格嚴謹而有邏輯,Erik風格形象生動。這應該是全網最優秀的教學資源了(某客的演算法導論課程沒上過,不作評價)。但是其中還是有些是遺漏的,譬如堆排序和B樹等等是沒有的。根據網友的推測,是在MIT的習題課上講了,而那一部分是沒有錄像的,所以只能自己看書。還有一些是課程有提及,但書本沒有的,譬如跳躍表以及高級課題等等。課本講義(Introduction to Algorithms (SMA 5503)):
由於該課程錄製的時候畫質較低,所以全網都沒有所謂的高清版本視頻課程。所以看老師黑板板書部分一塌糊塗也也只能將就。但MIT課程主頁是有講義提供的(就是老師上課時候看的那份PPT)。幾乎每一節都有講義。講義位置在VIDEO LECTURES→相應Lecture→視頻下方的Related Resources→Lecture Notes(PDF)。在上相應課程時候可以打開來看,可以解決看不清楚板書的後排學生難題。演算法導論教材(購買鏈接):如果玩演算法的人組成宗教的話,演算法導論就是聖經。這本大部頭肯定是必備的。時間計劃本人在中學時代被GTD害得不淺。所謂的一天背10個單詞,一年下來就背3650個了;一個月讀三本書,一年下來整個人都博學了等等,都是Nonsense,這些鬼計劃除了把人的時間碎片化以外不會給個人帶來任何的收益。我個人信奉的生產力是Deadline。在Deadline面前,所有的矯情都會化作蒼白。所以我個人的計劃就是,盡量推掉所有無關的事情,專註於學習算導課程,並預計一個能完成的Deadline,並向著那個目標努力。所以說從17年第一天到現在,我除了吃飯睡覺外,全部時間都放在學習演算法導論上面。其原則就是:只專註於一件事情,並儘可能做得漂亮(向喬布斯致敬)。
學習目的了解演算法導論梗概,並實現大部分演算法。豆瓣上有人把CLRS通讀下來,把書本內容全部看完且看懂,用了二十個月。可見這本書絕對不是等閑之輩。所以我在最初時候目標就不是如鏈表般全部深讀,而是如跳躍表般把重要的部分理解,然後跳過並不重要的部分。由於我是帶著提高編碼能力的初衷進行學習的,所以我跳過了推理證明部分,而把精力放到了理解偽代碼/演算法上面。這樣學習起來不會如愚公移山一般艱難,而且能學到自己感興趣的東西。學習收穫
大部分課程中提到的演算法都實現了一遍,具體演算法如下:- 插入排序;
- 歸併排序;
- 二分查找;
- 快速階乘;
- 斐波那契數列(包括原始演算法、線性演算法、遞歸矩陣演算法);
- Strassen演算法;
- 堆排序;
- 基數排序;
- 中分查找;
- 鏈表哈希演算法;
- 開放地址哈希演算法;
- 隨機化查找;
- 隨機化快速排序;
- 二分查找樹;
- 紅黑樹;
- 棧;
- 雙向鏈表;
- 循環隊列;
- 最長子字元串問題;
- 圖的廣度/深度優先搜索;
- 單源最短路徑Dijkstra演算法;
- 跳躍表。
Github地址:https://github.com/hating/IntroductionToAlgorithms。
歡迎來Star。下一步目標演算法是個很重要的東西。只要人還在計算機行業謀生,就需要繼續學習演算法。細心的讀者可以發現我並沒有實現B樹和van Emde Boas樹等等。這些都會陸陸續續放到Github上的。不過下次寫關於演算法的文章不知猴年馬月,這個專欄還是多聊聊安全吧~推薦閱讀: