哪些書籍能提高程序員的演算法能力?


【入門進階篇】

推薦@peng_gong的我的演算法學習之路。該文里提及了不少通用的數據結構與演算法教材,以及作者閱讀的體會。

如果文中的演算法書都能hold住了,再接下兩板斧:MIT的Advanced Data Structures和Advanced Algorithms兩門課。另外還有一本Advanced Data Structures: Peter Brass: 9780521880374: Amazon.com: Books,難度比MIT兩門課小不少,篇幅適當,也講了一些有趣的話題(making data structures dynamic/persistent, etc)

【領域特定篇】

Purely Functional Data Structures: Chris Okasaki: 9780521663502: Amazon.com: Books

Pearls of Functional Algorithm Design: 9780521513388: Computer Science Books @ Amazon.com

對函數式語言程序員有用。

Distributed Algorithms: An Intuitive Approach: Wan Fokkink: 9780262026772: Amazon.com: Books

分散式演算法書。篇幅短,介紹直白。

Hacker"s Delight (2nd Edition): 9780321842688: Computer Science Books @ Amazon.com

位運算黑魔法教材,對底層感興趣的程序員可以看下。

Algorithms on Strings: Maxime Crochemore, Christophe Hancart, Thierry Lecroq: 9781107670990: Amazon.com: Books

Parsing Techniques: A Practical Guide (Monographs in Computer Science): Dick Grune, Ceriel J.H. Jacobs: 9780387202488: Amazon.com: Books

做字元串處理有用。

Foundations of Multidimensional and Metric Data Structures (The Morgan Kaufmann Series in Computer Graphics): Hanan Samet: 9780123694461: Amazon.com: Books

空間數據結構,做圖形學/地理資料庫等有用。

Clever Algorithms: Nature-Inspired Programming Recipes: Jason Brownlee: 9781446785065: Amazon.com: Books

少有的啟發式演算法綜合教材,講到的啟發式演算法很多,模擬退火/蟻群優化/遺傳演算法/神經網路等等均有涉及,有ruby示例。

【一代宗師篇】

An Introduction to the Analysis of Algorithms (2nd Edition): Robert Sedgewick, Philippe Flajolet: 9780321905758: Amazon.com: Books

Sedgewick又一力作,如書名,介紹分析演算法複雜度的各種數學技巧。

Handbook of Data Structures and Applications (Chapman Hall/CRC Computer and Information Science Series): Dinesh P. Mehta, Sartaj Sahni: 9781584884354: Amazon.com: Books

比Peter Brass的Advanced Data Structures還要Advanced得多的數據結構書,已經非常接近學術前沿了。可以當作wikipedia以外的數據結構參考書。。。

The Art of Computer Programming, Volumes 1-4A Boxed Set: 9780321751041: Computer Science Books @ Amazon.com

神作鎮樓。


強烈推薦學習Coursera上的這個在線課程:Algorithms, Part I (https://www.coursera.org/course/algs4partI)

普林斯頓的課,如果你只懂得什麼是棧、隊列,卻連一個set類都實現不出時,聽這個課是最合適的了。免費的。

PS:這個課馬上就要結課了,視頻、課件等資源會再保留一個星期左右,但下載到本地是合法、免費的,感興趣的話抓緊下載。另外,Algorithms, Part II(https://www.coursera.org/course/algs4partII)馬上又要開課,可以去選。時間充裕的話,最好能認真完成作業,作業通過類似ACM競賽評測系統的一個自動評分系統提交。Coursera上面的課絕大多數都是精品,不止是理工類的課。很多人文社科類的課也非常推薦。


通俗易懂:

Allen Downey, Think Complexity: Complexity Science and Computational Modeling

Think Complexity: Complexity Science and Computational Modeling: Allen B. Downey: 9781449314637: Amazon.com: Books


入門級書目就不說了,參見各種演算法課本,其中大部分常見演算法打一遍你就入門了。

《編程珠璣》:這本書,總感覺是給不懂演算法的人講一些演算法的,經常玩演算法的會感覺好多他講得似乎很神奇的東西,其實很常見...不過這本基本上是面試必讀書目,因為許多人都愛出這上面的題。

《演算法導論》:經典書目,必讀,如果有能力,也可以拿它當入門書。

《計算機程序設計藝術》(TAOCP):這個,我沒讀多少,太數學了,自己功底還不夠。。得再修鍊幾年。

《演算法藝術與信息學競賽》(劉汝佳的黑書):這本書會給你提許多信息學競賽中常用的演算法,演算法說得比較深入,但是很多時候書中的一個顯然夠你證明一個星期了。讀這本書主要是讓你知道原來還有這麼種演算法,具體這種演算法該怎麼去實現,你自己去找相關資料吧,因為這本書講得確實不詳細。


我的理解是,演算法能力分為三種,由低到高,逐步升級,

1 基礎演算法的理解,包括為演算法提供數據存儲的數據結構,以及如何操作這些結構的演算法,經典的如二分,貪心,動態規劃等等,這些的提高相信很多人都回答了,很多經典書籍;

2 演算法的運用,其實演算法本質上是解決一類共通問題的步驟,很多人抱怨工作中運用不到演算法,其實如果你精益求精,想把一個問題解決好,就是在運用和設計演算法的過程,這個過程需要你有基礎演算法的底子,否則也是巧婦難為無米之炊;

3 演算法的設計,這是最高的境界,接上面的話,如何優雅的解決一個問題,這就是演算法的設計過程,往往都沒有特定的演算法可以套用(不像ACM),這就是實際問題,你要做時間和空間的權衡,客觀條件是否允許你設計O(n^2)的演算法,因為這樣邏輯或許會簡潔等等,有時候確實不會用到複雜的演算法和數據結構,但是你需要從它們的知識中了解它們產生的原因,運用了哪些思維方法,這些都是可以用到其他問題上的

所以,總結,儘可能把你遇到的問題多想上幾遍,優雅的去解決,平日里我更看中解決問題的能力,而不僅僅是演算法能力了。


在去讀其他答友推薦的書之前請先把 leetcode 做完.

百分之九十的自學者把百分之九十的時間花在了選書上。剩下的百分之十里百分之九十九的人沒有踏實讀完過任何一本他們買的書。


我講授演算法課的參考書豆列:『演算法設計與分析』授課參考書

排名先後:前三名是深入淺出的經典,後面的書主要是供 備課/授課 參考用的。


先找入門的演算法讀懂了,然後在讀高大師的藝術什麼的。然後可以網上做些題目的。


先看普林的演算法,和演算法設計,然後把這本書刷掉,然後就開始堅持每隔幾天找道難題做,不是耐心驚人不要看CLRS,反正我看不進去


看演算法書只是幫你入門,提高的話需要多多實踐


演算法導論(有精力計算機程序設計藝術)+實踐


推薦閱讀:

創造編程語言應該學習什麼語言?設計編程語言最好是用C/C++嗎?
函數式編程的函數是如何實現的?
為什麼沒有中文的編程?
除了 Go、Rust、Nim,還有哪些新編程語言更靠譜?
作為程序員的你是在什麼時候「突然開竅」的?

TAG:編程語言 | 演算法 | 數學 |