《演算法(第4版)》書評:精緻思考下圖表的魅力

浮生小憩發表於2012-10-09

  演算法作為電腦科學的支柱,其重要性無論如何強調也不過分。演算法類圖書歷來分為兩類:學院派和實戰派,前者注重理論的優美和深刻卻迷失於繁瑣的證明推導,後者強調程式碼的簡潔和實用但缺少內在指導分析。能夠將兩者結合得很好的圖書非常少見,《演算法(第4版)》就是其中之一。

  全書分為基礎、排序、查詢、圖、字串、背景六章,基本涵蓋了基礎演算法的內容。本書完全從零起步,循序漸進的演繹手法使人輕鬆入門,讀者只需要具有基本的程式設計概念和基礎數學知識就可以閱讀本書。本書最大的特點就是豐富的圖形展示,圖形能夠形象地展現演算法過程,幫助讀者清晰地理解概念,不誇張地說,書中的配圖是筆者看過的最明白易懂的演算法圖。

  本書的程式碼採用Java實現,對Java的介紹略顯繁瑣,有基礎的讀者可以跳過,但作者自編的圖形庫需要了解,後面很多實現均基於此。對ADT的介紹涉及契約程式設計的基本概念,推薦仔細閱讀。演算法分析是全書提綱挈領,需要精讀:你會看到用餅圖配上“嘀嗒”的時鐘聲來形象感知演算法用時,用箭頭和方格圖清晰給出的原生型別和物件型別的佔用空間分析,配上散點圖和趨勢曲線描繪union-find演算法的時間複雜度讓人耳目一新,作者通過不同輸入規模的檔案手把手地教你如何對比並估算其執行用時,很少有人會如此耐心,如此細緻,有時甚至讓讀者感覺有些許囉嗦。

  作為一名正在準備ACM競賽的讀者,筆者閱讀過市面上不少ACM參考書,其中大部分都是題解思路加程式碼,給出的演算法模板不盡相同,經典的演算法也往往不加解釋。由於ACM選手通常都採用C++語言的STL,事先封裝好了大量基本操作,插入排序、快速排序、希爾排序等演算法逐漸退化為一個個概念,本書正好可以作為基礎演算法的參考實現常備案頭,既可以迅速回憶演算法原理,也可以直接應用書中程式碼(對於使用Java語言的ACM選手)。至於為什麼不用C++或Python進行描述,畢竟現在用Java的程式設計師數量最多,此類語言問題見仁見智吧。

  雖是經典之作,但筆者認為本書存在兩個缺點:一是書太厚,容易讓人喪失信心,個人更喜歡大一些薄一些的開本,原版的英文描述雖然淺顯易懂,但略顯重複嘮叨。另一個是理論上稍微薄弱了些,動態規劃沒有涉及,NP完全問題也僅僅是提及未做描述,但這些知識點讀者都不難從其他圖書(如《演算法導論》)中得到詳細描述,畢竟演算法博大精深,如果要面面俱到,只怕頁數再多一倍也不夠。

  但瑕不掩瑜,本書確實是一本不可多得的好書,既適合演算法初學者,也適合有多年程式設計經驗的高手,值得買回家細細品讀。正如吳文虎教授所言:“藝術與科學是相通的,都會給人以美的享受。體味思維藝術之美,我以為這可能是更高層次的享受。”讓我們泡上一杯咖啡,和作者一起暢遊在演算法的神奇世界裡,享受藝術的美妙吧。

相關文章