1. 程式人生 > >演算法與資料結構學習資源大搜羅——良心推薦

演算法與資料結構學習資源大搜羅——良心推薦

資料結構與演算法設計是CS相關專業的必修課,也是IT公司筆試面試的重點。網上這方面的資料多如牛毛,我列出了一些我認為非常值得推薦的資源,供有需求的讀者研習之用。首先是一些網路資源,然後是一些書籍點評和推薦。如果你有更好的推薦,歡迎在下方留言,我甄別之後會補充的這個列表中,也歡迎自薦。不斷更新中,但大浪淘沙,我只保留最值得推薦的。

1、法國魯昂大學(University of Rouen )Thierry Lecroq 教授關於字串(模式)匹配演算法的介紹內容

http://igm.univ-mlv.fr/~lecroq/string/node1.html

如果說道字串匹配演算法,你會想到哪些?只有KMP嗎?那你弱爆了:) 還不快來看Thierry Lecroq 教授

的主頁,在上述網站上,教授給出了超過30種模式匹配演算法的詳細介紹(有圖有文有例子)和實現程式碼。實在是不可多得但又未被人知的寶藏。國內很多教科書、文章、部落格都是以訛傳訛,連KMP和MP演算法的不同都搞不清楚,常常將二者混為一談,殊不知它們是兩個演算法。這個問題講起來話太長,總之各位還是要明辨真偽,自身水平挺高了,才不會收到誤導。

2、美國佛羅里達國際大學Mark Allen Weiss教授的主頁

http://users.cis.fiu.edu/~weiss/

Weiss教授是Knuth的徒孫(因為他博士導師是塞奇威克)。他在教書育人上成就其實比他在學術上的成就更大。其關於資料結構方面的教材在全世界大學範圍內被廣泛採用(後面我還要推薦

他的著作),並曾榮獲SIGCSE電腦科學教育傑出成就獎。他的資料結構書籍有多個版本,既有Java版,又有C++版,還有C版。而他的主頁提供了所有這些書籍中的原始碼下載。你能想過的資料結構,他基本都實現過,所以具有極高的參考價值。

3、Leetcode

https://leetcode.com/problemset/algorithms/

這個網站名氣很大!CSDN上到處是其中題目的解答。相信讀者可能已經瞭解過,這是美國一個IT筆試面試題目的online judge系統。裡面蒐羅了超過300道演算法與資料結構相關的題目。刷Leetcode絕對是訓練思維技巧、增進編碼能力的好方法。我偶爾也從裡面挑幾道題目做做,覺得是一件很有趣的事情,我思故我在:) 但我其實有種相見恨晚的感覺。我知道它的時候,我的演算法之美已經交稿編排了,(儘管後來發現我的書和Leetcode選的很多題目有很多類似的

)但如果我早日知道它,應該會為我的新書增加更多精彩。Anyway,各位可千萬別錯過它。當然,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),內有更多資源等你,而你在讀書中遇到的疑問也將得到我第一時間的解答。更多關注本部落格,我將陸續釋出該書全部原始碼至本部落格。