Amazon書評之《演算法》

謝路雲發表於2012-04-21

“參照國外讀者的評價,找到你需要的書。”在你決定購買本書之前,本欄目將努力向讀者朋友們呈現公正客觀的評價。

如果你發現這是本好書,請不要忘記收藏

5星評價:目前最好的演算法教科書

有用:77/81

作者:Kevin P. Murphy (不列顛哥倫比亞大學計算機系教授)

Robert Sedgewick和Kevin Wayne的《演算法》(第四版,由Addison-Wesley於2011年三月出版)是我讀過的最棒的電腦科學方面的書籍之一。它應該是所有程式設計師以及電腦科學專業的學生的必讀書籍——它的目標是覆蓋“每個程式設計師都應該瞭解的50個演算法”。下面我就來說說為什麼我覺得這本書是如此的優秀。

《演算法》包含了具體的原始碼(基於一個Java的子集),這和它的主要對手——由Cormen、Leiserson、Rivest和Stein (CLRS)完成的《演算法導論》(An introduction to algorithms)——非常不同。這一點非常重要,因為它意味著學生們可以使用這些程式碼去解決許多真實的問題。這些演算法產生了從網路搜尋到基因組學的許多有趣和令人激動的應用,這些應用也貫穿了全書。(這本書的網站上提供了所有的原始碼和資料)

對真實程式碼的一種很自然的擔心是它們可能會影響對概念的理解。但在這本書中,作者通過精心定義的抽象資料型別(佇列、揹包、雜湊表、樹、有向無環圖等類)賞心悅目的創造了許多既有可讀性又非常準確的實現。

使用真實程式碼的另一個好處是迫使你解決一些容易被忽略卻十分重要實現細節。例如,大家都知道並歸排序需要輔助性記憶體空間。在CLRS的虛擬碼中,作者在他們的並歸函式內部分配的臨時儲存空間。但在實踐中,僅分配一次臨時儲存空間並將它作為一個指標傳遞給並歸函式(或是將它作為並歸排序類的一個私有成員)將會高效的多。這種重要的技巧你又可以從哪裡學到呢?

除了程式碼的展示之外,本書也用清晰的語言解釋了這些方法。本書非常與眾不同的一點就是包含許多詳細的例子來說明這些演算法在處理真實資料時的行為和表現。(除非你真的實現了這些演算法,否則是很難得到這些資料的!)

這本書的另一個優點是它嚴格遵守了軟體工程的最佳實踐:先寫API,再寫單元測試或是實現一個使用該資料結構或演算法的應用(用例),最後才考慮應該如何實現這個API。另外,本書在許多時候還討論了同一API的多種實現,它們在簡潔性、速度和記憶體使用上的折中都各有不同。

對於資料結構,使用“類”是很自然的,但對於演算法作者也採用了這種描述方式,特別是圖演算法。這使得演算法能夠進行預處理並儲存一些內部狀態,然後再為使用者提供服務。這種方式比傳統的無狀態的函式式的演算法更加通用。

這本書的每一節都有大量的練習,分為“簡單”、“提高”和“實驗”三種,它的網站提供了部分練習的解答。

這本書的一個特別之處是除了理論之外,它還含有許多經驗性的演算法題目。它展示了演算法的不同實現對於不同規模問題的實際執行時間,並用這些資料作為傳統理論分析的補充。

相比CLRS,這本書的一個小小的好處是沒有那麼厚(約1000頁,而CLRS有1300頁)。另外,這本書也有Kindle版本,這意味著你可以不用帶著一本能夠把你的背壓斷的大部頭到處跑了。(儘管Kindle版本的排版並不盡如人意)

顯然,《演算法》和CLRS的內容有許多重疊。從書的目錄來看這一點並不明顯,因此我寫了一份更加詳細的列表來列出這本書討論了的所有問題。

全書的組織非常好,前面介紹過的內容(和程式碼)會在後面得到多次應用(例如:堆->優先佇列->最小生成樹的Prim演算法)。書中的話題也會越來越高階。因此讀者最好一頁一頁的順序的閱讀本書。

下面是我製作的一份書中的話題總結,因為它們從目錄上看起來並不明顯。

第一章 基礎

1.1. 基礎程式設計模型

-- Java入門

-- API與各種庫

-- 二分查詢(遞迴)

1.2. 資料抽象

-- 物件導向基礎

-- 避免“寬”介面

1.3. 揹包、佇列和堆疊

-- 泛型(C++中被稱為模板)

-- 迭代器

-- 表示式求值的Dijkstra的雙堆疊演算法

-- 動態陣列

-- 連結串列與指標

1.4. 演算法分析

-- 經驗性演算法

-- 大O記法(“線性對數”的意思是O(NlogN))

-- 隨機化的演算法

-- 記憶體的使用

1.5. 例項分析:union-find演算法

-- 應用:動態連通性(p、q是否是在同一個集合中?)

-- 三種實現,最後得到一種經典的演算法

第二章 排序演算法

2.1. 初級排序演算法

-- 選擇排序

-- 插入排序

-- 希爾排序

2.2. 並歸排序

-- 自頂向下的並歸排序(遞迴)

-- 執行時間是NlogN的證明

-- 自底向上的並歸排序

-- 證明排序所需的比較次數的下界是NlogN

2.3. 快速排序

-- 實現

-- 分析

-- 使用三向切分加快對等鍵情況的排序

-- 證明排序成本的下界是N乘以鍵的分佈的熵

2.4. 優先佇列

-- 堆

-- 優先佇列

-- 使用優先佇列解決得到一列數中最大的N個數的問題

-- 使用索引優先佇列實現N個有序列表的多向合併

-- 堆排序

-- 各種排序演算法的比較(速度、穩定性、原地性、額外空間的使用)

-- 順序統計以及在O(N)時間內找到中位數

第三章 查詢

3.1. 符號表(也叫做關聯性陣列)

-- 符號表與有序符號表(鍵可以被比較,因此可以得到最大和最小鍵)

-- 在一份大文件中統計詞頻

-- 無序連結串列中的順序查詢

-- 有序陣列中的二分查詢

3.2. 二分查詢樹

-- 二分查詢樹的性質(父節點比左子節點大,比右子節點小)

-- get和put方法的實現,以及對其所需時間為O(logN)的分析

-- 查詢最小元素、刪除最小元素、刪除任意元素

-- 中序遍歷

3.3. 平衡查詢樹

-- 2-3樹和紅黑樹

3.4. 雜湊表

-- 雜湊函式(例如,取模以及Horner法則)

-- 拉鍊法

-- 線性探測法

3.5. 應用

-- 去重

-- 字典查詢

-- 逆向索引

-- 檔案索引

-- 稀疏矩陣向量的乘法

第四章 圖

4.1 無向圖

-- 臨接表的表示

-- 深度優先搜尋

-- 廣度優先搜尋

-- 基於廣度優先搜尋的單點最短路徑演算法

-- 基於深度優先搜尋的連通分量演算法

-- 使用深度優先搜尋判斷G是否是無環的

-- 使用深度優先搜尋判斷G是否是二分的

-- Kevin Bacon遊戲(六度理論)

4.3. 加權無向圖的最小生成樹

-- Prim演算法

-- Kruskal演算法

4.4. 加權圖中的最短路徑

-- Dijkstra演算法

-- 加權有向無環圖中的最短路徑

-- 排程問題的關鍵路徑演算法

-- 加權有環有向圖中的最短路徑(Bellman-Ford演算法與負權重邊的檢測)

-- 套匯

第五章 字串

5.1. 字串排序

-- 鍵索引計數法(基數排序)

-- 低位優先的字串排序

-- 高位優先的字串排序

-- 適用於帶有重複字首字串的三向字串快速排序

5.2. 字典查詢樹

-- R向字典查詢樹

-- longestPrefixOf方法(最長公共字首)

-- 三向字典查詢樹(R向陣列的二分查詢樹表示)

5.3. 子字串查詢

-- 暴力方法

-- KMP演算法

-- Boyer-Moore演算法

-- Rabin-Karp指紋演算法

5.4. 正規表示式

-- 語法

-- 使用非確定性有限狀態自動機判定字串是否在特定的語言中

5.5. 資料壓縮

-- 基礎知識

-- 遊程編碼

-- 哈夫曼壓縮演算法

-- LZW壓縮演算法(基於字典查詢樹)

  1. 背景

6.1. 基於優先佇列的事件驅動模擬

6.2. B樹

6.3. 字尾陣列

-- 找出最長重複子字串

-- 字串的索引(上下文中的關鍵字)

6.4. Ford-Fulkerson最大流量演算法

-- 尋找最短增廣路徑

-- 最大二分圖匹配問題向最大流量問題的歸約

-- 最大流量問題和最短路徑問題向線性規劃問題的歸約

6.5. NP完全性

五星評價:溫故而知新

有用:6/6

作者:Edward A. Averil

在20年的核心程式設計、裝置驅動、程式控制和其他實時系統的工作之後,我的演算法知識絕大部分都已經荒廢了。現在當我回頭再次需要完成一些高層次的工作時,我就遇到麻煩了!

但這本書裡有我需要的一切,而且它比伴隨我成長的Knuth的那本書要易懂的多。我也非常喜歡書中的範例實現,當我看到程式碼時一些疑惑就自然消解了。

對於所有正在轉換工作領域並需要重新掌握那些基本程式設計技巧的人來說,我強烈的推薦這本書!

四星評價:當年我要是能有這本書……

有用:0/0

作者:T. A. Lovern

我真希望當年我在上演算法課時使用的是這本書。書中的例子都是精心選擇的,概念詮釋的很充分,程式碼簡明厄要。全書的章節一步一步的構建起了一個演算法庫,這使得跳過部分章節直接閱讀特定的例子變得有些困難。所有這些程式碼和庫都可以從這本書的網站上獲取。

所有程式碼都是用Java寫的,這正合我意。

我向我的組員們推薦了這本書——並非必讀,但它應該成為他們的工具箱中的一員。

在優化倉儲操作時對最短路徑演算法的需求讓我找到了這本書。我大概瞭解我所需要的演算法,但還需要一些幫助。我只看了線上章節兩分鐘就決定要買這本書。這是個非常正確的決定。

相關文章