如何學習數據結構?


如何學習數據結構?

作者:孟蛋蛋
鏈接:https://www.zhihu.com/question/21318658/answer/42690576
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

前言

2015年03月第一次編寫這個答案,之后於2016年01月和2018年03月分別進行整體修改。只適合於入門,評論中的一些問題參見集中回復

正文

我覺得入門學習算法與數據結構時應包含三個部分:

  • 選擇一本合適的書。
  • 編程實現和應用。
  • 反復學習。

1. 選擇一本合適的書

十分推薦普林斯頓的這本橙書:《算法 第四版》,是我認為最適合拿來入門的。在橙書中淡化了算法分析和證明,強調了實現和應用,並且通過一些有趣的習題對比顯示了優秀的算法與數據結構在時間和空間上的高效。

橙書是使用 Java 進行代碼實現,在第一章前兩個小章節介紹了全書可能需要使用到的一些簡單的 Java 語法,使得我們不會將過多的精力花費在編程語言的學習上。

並且普林斯頓在 Coursera 上也公開了兩門對應課程:Algorithms, Part IAlgorightmsm, Part2。依次注冊待開課后,認真跟住課上內容(英文授課有字幕,如果已熟稔書本內容,並事先自己翻譯了課件,英文聽力不好也能理解),並獨立完成 Exercises(選擇題),Programming Assignmengs(編程作業) 和 Job Interview Questions(面試題)

這2門 Coursera 公開課在知乎上也盛譽很多,在此不多贅述。不收費,同時也不給電子證書,一年開課幾次,可隨時加入。

2. 編程實現和應用

理解一個數據結構與編程實現其完整功能是完全不同的挑戰。自己動手親自實現一些基礎數據結構(如排序,集合,圖和字符串處理)的簡化版 API 能夠極大的提升對數據結構內部細節的理解。

編寫 API

我曾使用的一個較笨的方法是嘗試默寫書本中的實現。另一種較有成就感的方法是在如 Leetcode 等 OJ (Online Judge) 上,選擇一些簡單的但會使用到上述基礎數據結構的題目,自己實現那些需要使用到的數據結構,而不使用語言本身提供的,如 c++ 的 STL 或 Java 的 util。

可視化幫助

同時,除了底層 coding,最好也從頂層宏觀的去觀察一種數據結構的各種操作。這里推薦一個動態可視化網站 Visualgo。比如進入 Binary Heap(二叉堆),插入一個77,就可以看到整個堆的變化過程。可以通過左下角的按鈕調慢演示過程。正剛剛在書本上學完二叉堆原理,可能也自己動手 code 實現了過程,那么再在網站上演示一下元素的各種操作過程,會帶來一些更直觀的印象。

(在 Visualgo 上進行二叉堆操作的演示)

嘗試應用

  • 認真且獨立完成 Coursera 上《算法 第四版》的公開課作業。
  • 對書本后的編程習題進行實現。
  • 在 Leetcode 等 OJ 上解決相關數據結構的題目。
  • 網上一些開源項目等。

以上這些實踐均能較快產生成就感。算法與數據結構學習不算輕松,能有一些及時的正反饋最好。

3. 反復學習

因為算法與數據結構所涵蓋的知識較多,所以一本書里的內容可能都需要分幾個階段去學習,難免會遺忘之前的內容。我建議敏捷學習,盡量快的往后學習。如果一個知識點實在不懂,可以存疑,“不求甚解”,很多時候經過后面的學習,前面的一些內容就自然明了。然后反復學習。

除了基本的復習,還需要其他書籍進行一些補充和升級。推薦《算法導論》。除顯著加強算法分析的能力外,一些算法章節,如攤還分析,動態規划等是對《算法 第四版》較好的補充。其網上開放課程,中文有網易公開課,英文有 Coursera: Algorithms Specialization(可不要證書免費旁聽)。

總之,要 多做題善總結! 可以是 Online Judge 上的編程題,書后思考題,手上的編程項目或者面試題等等。


補充

  1. 因為我第一次編寫這個答案時正看完《數據結構與算法分析 - C 語言描述》,就在第一版回答中推薦了這本書。然而作為入門(個人意見)不如橙書詳實,但它用 C 語言實現 ADT (抽象數據類型)的方法值得借鑒。

集中回復

1. 問題是關於考研數據結構的學習,回答偏題!
確實。因時間久遠我已經不記得原問題是什么,當初為什么在這個問題下寫這個答案,歸為某個被遺忘的歷史原因吧。

2. 沒用過 Java/C/C++ ,要先學編程語言
沒必要。絕大部分書會使用某一特定語言進行代碼實現,但都只用到該編程語言最基本的語法,凡有編程基礎,都不需先從頭學這門語言。

3. 英文不好,聽不懂 Coursera 上的公開課。
可以先閱讀中文書學習知識點,預先翻譯網課課件,慢放視頻,實在不行可暫停播放手動翻譯字幕。剛開始這么做確實很吃力,但越往后越輕松,因為陌生的詞匯就那么多,會一個少一個。

4. Coursera 需要FQ?PC 上打不開。
PC 上訪問不需要FQ,可能是 DNS 污染的問題,參考 知乎回答

5. 《算法 第四版》課后題好多,又沒有參考答案。
關於書后習題的討論,參考 知乎回答

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM