北京 liuxinyu 同學寫完《初等演算法》。全書英文寫作,600 多頁:我終於寫完了《初等演算法》一書。
這本書完全免費,可以從這裡下載電子版:https://github.com/liuxinyu95/AlgoXY/blob/algoxy/preview/elementary-algorithms.pdf?raw=true
Why
演算法書籍汗牛充棟,《演算法導論》,《計算機程式設計藝術》,《計算機程式的構造和解釋》……,為什麼要寫這麼一本書?是不是重複發明輪子?
這本書的特點有以下幾個:
1、形式化。所有的演算法都儘量形式化為數學公式,同時給出虛擬碼。我希望能夠讓演算法迴歸數學,具有代數符號般的簡潔和優美;
2、函式化和 imperative 對照。幾乎所有的演算法都同時給出了傳統的 imperative 實現和純函式實現。
3、多語言。儘量給出了多種語言的實現,包括C, Haskell, Python, C++, Scheme/Lisp 等。
4、儘量手繪插圖,兒童畫風格。
- 歸併排序的插畫
- 跳躍青蛙問題的插畫
- 狼、羊、白菜過河問題的插畫
- 選擇排序的插畫
內容:
《初等演算法》一書包括瞭如下內容(按照出現順序給出):
二叉樹、插入排序、紅黑樹、AVL 樹、Trie 和 Patricia,字尾樹、B樹;
Binary heap, Leftist heap, Skew heap, Splay heap, 選擇排序,Binomial heap, Fibonacci heap, Pairing heap;
佇列,基於 Finger tree 的序列,快速排序,歸併排序,眾數查詢、二分查詢,Saddleback 查詢,KMP 和 Boyer-Moore 查詢,DFS, BFS,貪心策略和動態規劃。
參考:
有兩本書對《初等演算法》影響最大。一本是 Chris Okasaki 的《Purely functional data structure》另外一本是《演算法導論》。寫作過程中還參考了一些其他書籍,包括 Knuth 的《計算機程式設計藝術》,Richard Bird 的《Pearls of functional algorithm design》,Bentley 的《程式設計珠璣》以及一些論文。
不足:
寫這本書的六年中,我總是想起法國數學天才伽羅瓦最後寫的那句話:“我沒有時間了!”,我原計劃用 10 年寫完這本書,結果提前了 4 年。這樣的代價很大。為了避免翻譯,過濾“噪聲”,我直接用英文寫作。由於不是 native speaker,書中的英文語法和拼寫難免貽笑大方。為了趕時間,proof reading 被壓縮,許多結論採取了“拿來主意”,沒有進行嚴格的數學證明。一些章節的課後習題也沒有給出答案。
未來:
理想情況下,一本嚴肅的演算法書應該在穩定、寬鬆的環境下精雕細琢。可是在社會劇烈發展的今天,在日新月異的中國,在人們習慣快餐而不再享受大餐的快節奏生活中,在微博、微信取代文章、書信的手機網路大潮下,這樣的理想環境根本不存在。我經歷了 Symbian 的裁員,然後經歷了網際網路創業公司,到 Nokia 後又經歷了微軟的裁員。未來不可預知。對於《初等演算法》這本書,開放給社群是最好的選擇。需要做的工作很多:
- 翻譯中文版
- 社群 proof reading 和 review,修正內容上的錯誤和英文上的不足
- 提供一本習題集
- 補足數學證明
- 採用強大的數學工具,對形式化的演算法進行分析
一些資料:
《初等演算法》黃金分割 0.618 版本,歷時 6 年,在 github 上總共提交 1680 次 commit。全書 600 多頁,19 萬字(word)。2 萬 2 千行示例程式碼。
保護:
《初等演算法》在 GNU FDL 許可協議下發布,所有程式碼在 GNU GPLv3 協議下發布。
Larry, LIU Xinyu