\\關鍵點
\
- 這本書目的是告訴讀者解決問題的新方法。 \
- 這本書試圖通過插圖來讓大家更容易掌握主題,避免部分讀者覺得太費解。 \
- 這本書不僅適合沒有接觸過算法的人,也適合剛從計算機專業畢業的學生。 \
- 這本書提供了非常多的例子和簡單練習。 \
- 這并不是一本參考書,也不是練習書。它只包含了作者日常編程實踐中證明了有用的算法。
Aditya Y. Bhargava所著Grokking Algorithms(曼寧出版社出版)采用了一種全新的方式來介紹數據結構、算法和復雜度等復雜概念。作為一個視覺型學習者,Bhargava說他試圖借助插圖的強大表現力來幫助讀者更容易地掌握主題,避免部分讀者覺得太費解。\
這本書假設讀者已經有了編程基礎。Bhargava說它不僅適合沒有接觸過算法的人,也適合剛從計算機專業畢業的學生。\
書中前3章介紹了大O符號和遞歸等基本概念。讀者在這里可以讀到關于數組和鏈表等數據結構的例子,還有二分查找和選擇排序等算法。\
第4章以快速排序算法為例,介紹了分而治之的解決問題方法。\
第5到7章主要介紹了哈希表和圖。除了詳細描述哈希表和圖到底是什么之外,書中還提供了許多非常有意義的用例來幫助大家理解它們的使用場景。哈希沖突和性能內容都有所覆蓋,還有如何選擇一個合適的哈希算法等。至于圖,廣度優先算法和Dijkstra最短路徑優先算法都有所講述。\
第8章和第9章用貪心算法和動態規劃方法來解決一些基本問題。貪心算法是在NP完全問題的背景下介紹的。貪心算法和動態規劃方法都用來解決旅行商問題、背包問題等經典問題。\
第10章介紹了K近鄰算法(K-nearest neighbors,KNN算法),這是一種用于聚合的機器學習算法,比如設定一些數據點之間的距離定義,就可以使它們呈現出一定的聚合狀態。這一章非常簡單的介紹了一下機器學習后面的基本算法。\
在最后一章即第11章里作者簡單介紹了10個算法,為讀者的進一步學習做了鋪墊。算法包括基于樹的搜索、倒序索引、傅立葉變換、Map-Reduce算法、SHA哈希等以及其他幾個。\
全書通篇都會通過插圖來解釋各個重要概念,特別有趣的是關于一些抽象概念的插圖,比如遞歸和分而治之等。除了用插圖去解釋每一個概念之外,書中還提供許多的示例代碼供讀者去構建和執行,還有許多簡單的練習題,這樣作者可以在繼續下一章內容之前評估一下自己對已讀內容的理解程度。在書的最后一章提供了所有練習題的解決方案。全書示例代碼都是用Python寫的。\
InfoQ采訪了Aditya Y. Bhargava來了解更多的幕后內容。\
InfoQ:能請您解釋一下寫這本書的動機嗎?除了是一本插圖書之外,它與其他的算法書還有什么不同?\
\\Aditya Y. Bhargava: 我關注使概念更容易被理解的方法。比如我寫書的原則之一就是“要夠用還是要全面”。很多書都是直接把很多的概念直接拋給讀者,不管有用沒用,這種就是“全面”的方法,我直接一股腦全說了,說不好什么時候你就用得上。而我的書則是用“夠用”的方法:我只告訴讀者他們現在需要知道的東西。所以我給的例子都會很簡短,但都直很切題。
InfoQ:您能簡單介紹一下您的計算機科學背景,以及您對算法的興趣嗎?\
\\Bhargava:我是個自學成材的工程師。我最初是用Basic語言寫游戲,后來改用ActionScript。我一直都覺得算法很困難,直到終于有一天有一位老師真的幫我把概念都解釋清楚了。從那時候開始我就知道了如果你能用一種好方法去解釋的話,算法其實并沒有那么難。
InfoQ:那您是怎么想到寫一本關于算法的插圖書呢?圖畫為什么會對解釋和理解算法有幫助?\
\\Bhargava:從2013年開始我就在我的博客上寫有插圖的文章了。我收到了很多讀者善意的留言,都說插圖幫他們更好的理解了概念。曼寧出版社聯系了我,說想出一本插圖書,我就想到算法會是一個好的點。算法都是非常抽象的概念,但圖畫可以讓它們具體化。
InfoQ:第一眼看上去,您的書會非常吸引那些以前沒有什么算法知識的程序員。您覺得對于那些曾經正式學過算法的程序員們來說,他們也會覺得這本書很有趣嗎?您的書對他們有什么價值?\
\\Bhargava:很多人都喜歡我關于動態規劃算法的那一章。即使是對于科班計算機學科出身的人來說,我仍然覺得動態規劃算法很難理解。我們給那一章寫了很長的一節FAQ來給大家解釋清楚動態規劃算法的難以理解的部分。\
有些人喜歡我給的例子。其實要解釋好一個概念,是很難找到非常合適的好例子的。所以如果你想把這些概念教給別人還想讓別人真的理解的話,我的書是非常有用的。
InfoQ:您的讀者該期望從您的書中得到些什么?不該期望得到什么?\
\\Bhargava:我的書會教給讀者解決問題的新方法。有些讀者的目的是擴大自己的工具箱,那么他們現在就應該能解決一些他們以前解決不了的問題了。\
我只為本書選擇那些在現實工作中有用的算法,所以這里的每一章都是非常有用的。比如我并沒有講解插入排序算法,雖然別的算法書都會提到它,但實際上它并不會對讀者的工作有什么幫助。所以讀者不該期望這是一本參考書,那樣會讓這本書不得不加入許多無用內容。
InfoQ:請問對于那些以前并沒有學過算法,但又想通過讀您的書來攻克這個有些難的領域的程序員,您有什么建議嗎?\
\\Bhargava:請一定把練習題都作了,大部分都很容易,幾分鐘就能作完。這些題可以確保你們理解了這些內容。
InfoQ:算法是個非常大的領域。您是用了什么標準來做取舍,講什么和不講什么呢?\
\\Bhargava:我只選擇那些對于我來說在我的日常工作中非常有用的算法,而且我也只選那些不需要有很多預備知識的算法。
InfoQ:在您做了插圖的那些算法中,哪個是最有趣的,哪個是最難的?\
\\Bhargava:最有趣的是為分而治之配圖,因為它太適合用可視化的方法表現了。最難的是動態規劃算法,因為在方框中很難跟蹤表現那些值。
InfoQ:有沒有什么算法是你本來想在書中做介紹,但最后還是沒有加進來的?\
\\Bhargava:當然有!我在第11章,用了一整章來列出了10個我本來想詳細介紹的算法。其實我本來真的很想介紹一下線性規劃算法的,因為它太強大了。
InfoQ:最后,對于那些讀過了您的書還想在算法方面繼續深入的讀者,您有什么建議嗎?他們接下來該怎么做?\
\\Bhargava:在網絡上有太多的資源了,比如adit.io(我的博客)和betterexplained.com這兩個博客。Coursera的機器學習的課程也非常好。
關于書的作者
\Aditya Y. Bhargava是一位有計算機科學和美術雙學位的軟件工程師。他關于編程的博客是adit.io。
閱讀英文原文:Grokking Algorithms Review and Author Q\u0026amp;A