《演算法導論》快速指南:我是如何10天入門演算法導論的。

知乎上總有一種聲音:

如果你沒讀過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通讀下來,把書本內容全部看完且看懂,用了二十個月。可見這本書絕對不是等閑之輩。所以我在最初時候目標就不是如鏈表般全部深讀,而是如跳躍表般把重要的部分理解,然後跳過並不重要的部分。由於我是帶著提高編碼能力的初衷進行學習的,所以我跳過了推理證明部分,而把精力放到了理解偽代碼/演算法上面。這樣學習起來不會如愚公移山一般艱難,而且能學到自己感興趣的東西。

學習收穫

大部分課程中提到的演算法都實現了一遍,具體演算法如下:

  1. 插入排序;
  2. 歸併排序;
  3. 二分查找;
  4. 快速階乘;
  5. 斐波那契數列(包括原始演算法、線性演算法、遞歸矩陣演算法);
  6. Strassen演算法;
  7. 堆排序;
  8. 基數排序;
  9. 中分查找;
  10. 鏈表哈希演算法;
  11. 開放地址哈希演算法;
  12. 隨機化查找;
  13. 隨機化快速排序;
  14. 二分查找樹;
  15. 紅黑樹;
  16. 棧;
  17. 雙向鏈表;
  18. 循環隊列;
  19. 最長子字元串問題;
  20. 圖的廣度/深度優先搜索;
  21. 單源最短路徑Dijkstra演算法;
  22. 跳躍表。

Github地址:github.com/hating/Intro

歡迎來Star。

下一步目標

演算法是個很重要的東西。只要人還在計算機行業謀生,就需要繼續學習演算法。細心的讀者可以發現我並沒有實現B樹和van Emde Boas樹等等。這些都會陸陸續續放到Github上的。不過下次寫關於演算法的文章不知猴年馬月,這個專欄還是多聊聊安全吧~
推薦閱讀:

開源,一起來搞事情啊
比較一下高性能計算和雲計算的異同?

TAG:算法 | 计算机科学 |