知乎上總有一種聲音:

如果你沒讀過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/Intro

ductionToAlgorithms

歡迎來Star。

下一步目標

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