前言
我第一次寫這個答案是在2015年3月,然后在2016年1月和2018年3月進行了整體修改。只適合入門,有些問題請看評論里的。
文本
我認為開始學習算法和數(shù)據(jù)結(jié)構(gòu)時應(yīng)該包括三個部分:
1.選擇合適的書
強烈推薦普林斯頓的這本橙皮書:《算法第四版》,我認為最適合入門。 橙皮書中淡化了算法分析和證明,強調(diào)實現(xiàn)和應(yīng)用,并通過一些有趣的練習進行對比,展示優(yōu)秀算法和數(shù)據(jù)結(jié)構(gòu)的時間和空間效率。
橙皮書使用Java進行代碼實現(xiàn)。 第一章的前兩小章介紹了全書可能會用到的一些簡單的Java語法,這樣我們就不會在學習編程語言上花費太多的精力。
而普林斯頓也出版了兩門相應(yīng)的課程:Part I 和 Part2。 按順序報到,等待上課,認真跟讀上課內(nèi)容(英語講座有字幕,如果你熟悉書本內(nèi)容并提前自己翻譯過課件物理專業(yè)課程順序表,即使你的英語聽力很差也能聽懂)不好),并獨立完成(選擇題)(編程作業(yè))和作業(yè)(面試題)
這兩門公開課在知乎上也很受歡迎,這里就不多說了。 不收取任何費用,也不提供電子證書。 這些課程每年開辦幾次,您可以隨時參加。
2. 編程實現(xiàn)與應(yīng)用
理解數(shù)據(jù)結(jié)構(gòu)和對其全部功能進行編程是完全不同的挑戰(zhàn)。 自己動手,為一些基本數(shù)據(jù)結(jié)構(gòu)(例如排序、集合、圖和字符串處理)實現(xiàn)簡化的 API,可以極大地提高您對數(shù)據(jù)結(jié)構(gòu)內(nèi)部細節(jié)的理解。
編寫API
我使用過的最愚蠢的方法之一是嘗試記住書上的實現(xiàn)。 另一種更有成就感的方法是在OJ(Judge)上選擇一些使用上述基本數(shù)據(jù)結(jié)構(gòu)的簡單題,自己實現(xiàn)需要使用的數(shù)據(jù)結(jié)構(gòu),而不是使用語言本身。 ,比如C++的STL或者Java的util。
可視化幫助
同時,除了底層之外,最好從頂層來觀察一個數(shù)據(jù)結(jié)構(gòu)的各種操作。 這里推薦一個動態(tài)可視化網(wǎng)站。 比如進入Heap(二叉堆),插入一個77,就可以看到整個堆的變化過程。 可以通過左下角的按鈕減慢演示速度。 我剛剛在書上學習完二叉堆的原理,我可能已經(jīng)自己編碼并實現(xiàn)了該過程。 然后演示網(wǎng)站上元素的各種操作流程,會帶來一些更直觀的印象。
(二叉堆操作演示上)
嘗試申請
以上做法都可以很快產(chǎn)生成就感。 學習算法和數(shù)據(jù)結(jié)構(gòu)并不容易,最好能有一些及時的積極反饋。
3、反復(fù)學習
因為算法和數(shù)據(jù)結(jié)構(gòu)涵蓋了很多知識,一本書上的內(nèi)容可能需要分幾個階段來學習,難免前面的內(nèi)容會忘記。 我建議快速學習,并且盡可能快地學習。 如果某個知識點確實不懂,你可以有疑問,“不求完整解釋”。 很多時候,經(jīng)過后續(xù)的學習,之前的一些內(nèi)容自然就會清晰起來。 然后一遍又一遍地學習。
除了基礎(chǔ)復(fù)習之外,還需要其他書籍進行一些補充和升級。 推薦《算法導(dǎo)論》。 除了顯著加強算法分析能力外,一些算法章節(jié),如攤銷分析、動態(tài)規(guī)劃等,都是對《算法第四版》很好的補充。 其在線公開課程包括網(wǎng)易中文公開課和英文公開課:(無需證書即可免費參加)
總之,多做總結(jié)! 可以是Judge上的編程題、書末的反思題、手頭的編程項目、或者面試題等。
補充:我第一次寫這個答案的時候正在看《數(shù)據(jù)結(jié)構(gòu)與算法分析——C語言描述》,所以我在第一版答案中就推薦了這本書。 不過作為介紹(個人觀點)它沒有橙皮書那么詳細,但是它用C語言實現(xiàn)ADT(抽象數(shù)據(jù)類型)的方法值得借鑒。 重點回復(fù)1.問題是考研數(shù)據(jù)結(jié)構(gòu)的學習。 答案是題外話!
真的。 因為時間過去了,我已經(jīng)不記得原來的問題是什么了。 我之所以在這個問題下寫這個答案,首先可能歸因于一些被遺忘的歷史原因。
2.如果你從未使用過Java/C/C++,你需要先學習編程語言
不需要。 大多數(shù)書籍都會使用特定的語言來進行代碼實現(xiàn),但它們只使用了編程語言最基本的語法。 任何有編程基礎(chǔ)的人都不需要從頭開始學習該語言。
3.我的英語不好,聽不懂公開課。
可以先看中文書籍學習知識點,提前翻譯在線課件物理專業(yè)課程順序表,慢動作播放視頻。 如果無法做到這一點,您可以暫停播放手動翻譯的字幕。 一開始確實很難做到這一點,但隨著時間的推移,就變得容易了,因為生詞就這么多,一個接一個。
4.需要繞過防火墻嗎? 電腦上打不開。
PC端無需翻墻訪問。 可能是DNS污染的問題。 答案請參考知乎。
5.《算法第四版》課后題較多,沒有參考答案。
書末習題討論請參考知乎的解答。
