演算法與資料結構學習資源大搜羅——良心推薦
資料結構與演算法設計是CS相關專業的必修課,也是IT公司筆試面試的重點。網上這方面的資料多如牛毛,我列出了一些我認為非常值得推薦的資源,供有需求的讀者研習之用。首先是一些網路資源,然後是一些書籍點評和推薦。如果你有更好的推薦,歡迎在下方留言,我甄別之後會補充的這個列表中,也歡迎自薦。不斷更新中,但大浪淘沙,我只保留最值得推薦的。
1、法國魯昂大學(University of Rouen )Thierry Lecroq 教授關於字串(模式)匹配演算法的介紹內容
http://igm.univ-mlv.fr/~lecroq/string/node1.html
如果說道字串匹配演算法,你會想到哪些?只有KMP嗎?那你弱爆了:) 還不快來看Thierry Lecroq 教授
2、美國佛羅里達國際大學Mark Allen Weiss教授的主頁
http://users.cis.fiu.edu/~weiss/
Weiss教授是Knuth的徒孫(因為他博士導師是塞奇威克)。他在教書育人上的成就其實比他在學術上的成就更大。其關於資料結構方面的教材在全世界大學範圍內被廣泛採用(後面我還要推薦
3、Leetcode
https://leetcode.com/problemset/algorithms/
這個網站名氣很大!CSDN上到處是其中題目的解答。相信讀者可能已經瞭解過,這是美國一個IT筆試面試題目的online judge系統。裡面蒐羅了超過300道演算法與資料結構相關的題目。刷Leetcode絕對是訓練思維技巧、增進編碼能力的好方法。我偶爾也從裡面挑幾道題目做做,覺得是一件很有趣的事情,我思故我在:) 但我其實有種相見恨晚的感覺。我知道它的時候,我的演算法之美已經交稿編排了,(儘管後來發現我的書和Leetcode選的很多題目有很多類似的
4、蘋果工程師給你講演算法
https://www.youtube.com/channel/UCZLJf_R2sWyUtXSKiKlyvAw
印度小哥Tushar Roy曾經多家北美科技公司就職(包括亞馬遜、蘋果等),他在Youtube上錄製了一系列講解演算法和資料結構的視訊,內容非常好,解釋非常清楚,當然前提是你能follow他的印度口音。
下面是一些書籍的點評(注意我用的詞是點評,所以不是我列的所有書都是推薦。你要看清楚我具體說的內容)
1、兩本神作
Knuth的《計算機程式設計藝術》,絕對業界巨擘,開山鼻祖,曠世奇書。國內中英文都已經有了,但是我非常不推薦大家閱讀。總之一句話,好書也不一定適合你。我在這評論它,因為我確實看過。別說沒告訴你,書裡的程式碼是用匯編語言寫的,而且是Knuth大神自創的一種組合語言,你要想想清楚,我想更多看本文的讀者應該是處於學習階段的,所以不要好高騖遠。另外一本是《演算法導論》,這個名氣同樣很大,對此我不做點評,因為我沒看過,我不能對我沒看過的東西做推薦。
2、Weiss教授的書
Weiss教授的書解決了我在早年學習資料結構時候的很多問題。我當時看的是清華出的C++版的影印版。中文版我作為比照參考最初也讀過,後來也是因為翻譯的不太理想就放棄了。現在不知道中文版的情況如何。Weiss教授的書還有Java版的。我主要看的是下面兩本,強力推薦
- Data Structures and Problem Solving Using C++
- Data Structures and Algorithm Analysis in C++
3、計算機演算法設計與分析,王曉東,電子工業出版社
我覺得這是中國人編寫的非常好的教材,貪婪、分治、回溯、動態規劃、概率演算法等幾大演算法設計思想都有覆蓋,並配合以許多典型問題的分析,還有關於P/NP問題的介紹。這本書可以作為研究演算法的參考書來看。我自己看的是第2版,很老了,現在應該有更新版。
其實資料結構的書我看過很多很多,所以我這確實還有一個不推薦的名單,但是那些書的推薦理由就跟Knuth的神作完全不一樣了。。。為了避免給大家帶來困擾我就不列出這個不推薦的名單了,原因你懂的。
另外,推薦兩部課外的業餘讀物(跟資料結構無關,但跟演算法有關)
4、圖靈的祕密,查爾斯·佩措爾德,人民郵電出版社
這是對圖靈生平和他論文的解讀。作者查爾斯·佩措爾德是大名鼎鼎的技術作家,他的另外一本神作是《Code:the hidden language behind the computer software and hardware》(中譯本《編碼:隱匿在計算機軟硬體背後的語言》,譯者不才正是在下》。圖靈為了給出演算法的精確定義(進而解決判定性問題)而石破天驚地構造了圖靈機這種神器,這其實是現代計算機演算法研究的一個重要開端。如果你連演算法是什麼都沒定義好,那何談演算法研究呢?而要理解圖靈當初提出的機器到底是啥,看這本書就對了。當然《圖靈的祕密》這本書讀起來其實有一定難度,如果你學過計算理論課程的話最好,或者你可以先讀下面這本書,這會幫你更好地理解《圖靈的祕密》。
5、計算理論導引,Michael Sipser
這是大學裡計算理論課程的教材。但是我還是非常推薦你作為課外讀物來讀(如果你沒學過相關課程的話)。如果說圖靈的研究離我們很遙遠,那麼這本書其實拉近了圖靈機和我們的距離。這本書會告訴你:我們討論演算法複雜度的大O表示法,本源就在於它是通過圖靈機(方格的移動)來定義的。你在王曉東的書以及演算法導論裡會看到NP問題,而我更建議你看計算理論導引來了解P,NP,NP完全問題的本質。(插一句,我前面說我沒看過演算法導論,但是我看過目錄,只是覺得從目錄來看,內容我基本都是瞭解的,所以未讀,但我也由此知道演算法導論都講了什麼)
-----------------------------------------------------------------------------------
6、演算法之美——隱匿在資料結構背後的原理
最後你可以認為是廣告貼,但我也是誠心推薦(正所謂舉賢不避親),畢竟我自己寫的書我還是看過的。但是將我的書夾雜在Weiss、Sipser等大神的書單裡,略顯不敬,所以我用一條華麗麗的橫向將它們隔開。我關於演算法和資料結構的一些所思所得彙集在我的新書《演算法之美——隱匿在資料結構背後的原理》中,請不要抱怨題目太大,因為這是出版社起的,對此我並不掌握主導權,作者其實很弱勢。你現在可能還無法買到,因為書才出,一些網店還沒有到貨。瞭解該書的內容請見前文 (http://blog.csdn.net/baimafujinji/article/details/50484348)。如果你是該書的讀者,請務必加演算法學習群(495573865),內有更多資源等你,而你在讀書中遇到的疑問也將得到我第一時間的解答。更多關注本部落格,我將陸續釋出該書全部原始碼至本部落格。