《算法的乐趣》终于出版了
經過一年多的編寫和準備,《算法的樂趣》終于出版了,4月中旬開始可以在京東、當當等網店購買,實體書店上架可能會慢一點。感謝圖靈社區的各位老師的辛勤耕耘,也感謝《啊哈!算法》作者紀磊先生(啊哈磊),LinkedIn高級主任分析師王益先生,極光推送首席科學家黃鑫先生(飛林沙)為本書熱情作序并給予充分的肯定。
序一
讀《算法的樂趣》的樂趣超出了我的預料。
說到算法,大部分計算機專業的同學的第一反應估計是MIT出版社的經典教材《算法導論》(Introduction to Algorithms)。這是一本由淺入深的好書,堪稱“神書”——別看書挺厚,但是對初學者來說很難弄懂的問題也娓娓道來,讓人看一遍就明白;而且作者用最簡單的英語詞匯和句法寫書,以至于世界各地的學生們,不需要英語很好,即可讀懂原版。只是看完這本大部頭之后,總有一些意猶未盡的感覺——對我們日常生活中常見的比如音樂播放器里以及電子游戲里的算法并沒有太多介紹。而這些正是《算法的樂趣》中主要的部分。
在Amazon上,另外兩本排名靠前的經典算法教材是Jon Kleinberg的《算法設計》(Algorithm Design)和Steven S. Skiena的《算法設計手冊》(The Algorithm Design Manual)。這兩本出自名家之手的教材和很多教材一樣,按照算法的類型或者背后的設計思路來組織內容。這是教材應該做的,“授人以魚不如授人以漁”,傳授思路而不是算法本身是教材的寫作目的??墒撬惴ㄗ钣幸馑嫉牡胤绞紫仍谟谒惴ū旧?#xff0c;因為算法是為了解決實際問題而設計的,所以讓大家認識到算法奧妙的自然順序應該是先展示有趣的問題,再展示優雅的算法,最后歸納設計思路。而這正是《算法的樂趣》吸引人的地方。說到樂趣,總讓我想起我學習和使用數學知識的經歷。雖然我的學位是關于統計機器學習的,而且畢業后一直從事相關工作,但是我從小學一年級到博士第三年都對數學毫無興趣,因為學校的老師和數學成績好的同學都說不明白數學的用處,以至于我一直以為數學的作用只是鍛煉和展示自己的聰明,博得老師的表揚,成為陳景潤那樣為國爭光的英雄。而這些對我實在沒有吸引力,而且我認為恐怕對絕大部分學生都沒什么吸引力。
我認識到數學的價值,是因為在博士第三年把研究方向換到了統計機器學習。在讀教材的時候,我曾想驗證“數學無用”,所以費盡心力地試圖寫一個程序來判斷一個64×64像素的圖片里到底是數字“1”還是數字“9”,卻發現無論如何也很難寫一個有效的程序;可是利用教材里的數學知識卻能設計和“訓練”一個數學模型,準確地識別任意字符。因為體會到了數學的用處,我興奮地用了一年的時間復習大學本科的數學課程,然后才讀懂了人工智能的專業教材和論文。此后才有所創新,發表論文,到博士畢業。這整個過程用了三年,而效果超過了之前19年數學教育的效果。
在這個過程中,我自然而然地開始注意數學知識的前因(比如為什么人們會關注長度、面積,怎么會有人考慮勾股定理這樣的規律)以及后果(今天的數學知識能給物理學和機器智能帶來什么樣的幫助),也開始歸納和了解各種數學系統背后的規律,能體會哥德爾定理闡述的意思。當然,也破除了“數學是各種科學之母”之類的迷信,數學當然不是“科學之母”,而是“科學之子”,是先有物理學、力學和天文學,才有的數學;先有應用場景后有工具,先有探索后有歸納。
算法也是如此。先有工程問題需要解決,算法是解法,設計算法是尋求解法。雖然算法作為一門科學是歸納尋求解法的思路,但學習這種歸納法的前提是能體會各種具體算法的用處和效果。意識到這一點,自然也就破除了諸如“學好數學才能學好算法”之類的迷信。而把算法解決的各種有趣問題羅列出來,把算法的可愛之處展示給愿意發現和體會生活中點滴樂趣的讀者們,正是《算法的樂趣》在技術價值之外的一層社會價值。
十年前,當我們坐在課堂里學習算法的時候,我們學到的是如何用人腦尋求解法,然后把解法寫成程序,讓計算機照著執行去解決問題。這是“經典算法”。最近十幾年,隨著Internet產業的興起,Internet服務在不斷取代原來由人提供的服務,這就要求機器擁有一定程度上能取代人的“智能”。在搜索引擎、推薦系統和廣告系統等各個領域里,類似上述“識別數字”的問題越來越多,而人工智能和機器學習的應用也越來越深入我們的生活。機器學習算法的設計目標和“經典算法”不同——不是讓人來想解法,而是讓計算機從數據歸納知識——有了這些知識,計算機就能自己尋求解法。
雖然經典算法和機器學習算法之間的差別大得如同一場革命,但是由經典而入機器學習的過程卻是自然而然的。比如《算法的樂趣》中介紹的曲線擬合問題,就是supervised learning(有監督學習),而音樂播放器里常用的傅里葉變換和其他時域頻域變換則是unsupervised learning(無監督學習)的技術基礎,棋類游戲算法是博弈論和reinforcement learning(強化學習)的經典例子。我常見有朋友從讀數學教材開始探索機器學習和人工智能算法,也常看到有人不堪忍受長時間缺乏樂趣的探索以至于半途而廢。如果是這樣,也許不如從《算法的樂趣》開始這個探索過程。
我曾經以為從樂趣出發闡述算法的書會從西方發芽,沒想到先看到了一本中文書。這真超出了我的預料。
王益
LinkedIn高級主任分析師
序二
當圖靈出版社的編輯找到我希望我為這本書寫個序的時候,我和旁邊的同事調侃了一句:又一本簡版的《算法導論》要誕生了。但是我還是下載了附件閱讀了這本書,當翻到目錄的時候,我的興趣就被燃起來了,轉頭和同事說,也許這是一本不錯的書。
程序員到底需不需要學習算法?這個問題被爭論的次數絕對不亞于“Java是不是最好的語言”“VIM和Emacs誰是最好的編輯器”“程序員是不是需要學習數學”。為了避免陷入這樣的爭論里,我們先對“算法”一詞做個轉換定義,什么是算法?下面我舉幾個我親身經歷的例子。
有一次我們發布了一個APP,在注冊時要求用戶輸入自己的真實姓名,但是粗心的工程師忘記了要求用戶填寫自己的性別,更可憐的是在歡迎頁上面明晃晃地寫著“歡迎XXX先生注冊XX網”,可是應用已經發布到了App Store,到底怎么辦?有一位工程師提出了一個辦法,我們根據已有的用戶姓名和性別作為訓練集,來預測新用戶到底是男還是女,為了讓這個錯誤盡快得到修復,我們使用了最簡單的樸素貝葉斯分類算法,最終測試集上的預測準確率達到93%,也就是說我們解決了93%用戶的體驗問題。我把這類算法稱為專業類算法,也就是招聘網站上算法工程師要求的算法,例如圖像處理工程師、數據挖掘工程師等。
有一次我們有一個相似性搜索的需求,數據量不大,只有幾萬條的數據記錄,沒有必要用ES這樣的搜索引擎。例如輸入“長沙市”, 也希望可以找到“我愛湖南長沙”“沙市小吃”等,且不說這個需求是否合理,我們單純來討論這個問題的解決方案。工程師實現的第一版是將所有字的組合全部列舉出來,然后在數據庫里做like操作,性能無法接受。于是我們提出了另一種解決方案:將數據庫中的每個詞都拆成單字,做成集合,保存在緩存中。接下來只需要對集合做交集操作,以字為單位計算詞與詞之間的相似性,性能問題一下就解決了。這種解題思路在《編程珠璣》中屢見不鮮,這不足以稱為具體的算法,幾乎都是在梳理我們的邏輯,訓練我們解決問題的能力,我把這類算法稱為邏輯類算法,或者技巧類算法。
還有一次,我們有個需求是幫助用戶做旅游的行程規劃,其中的情況比較復雜,因為除了地理位置之外,還需要包含目的地的過往用戶評價、所需耗時、不同城市的住宿花費等。但是如果我們仔細分析,可以基于產品設計去拆分問題。在在線部分,我們可以去使用基于路程的最短圖路徑算法,或者基于價格的貪心算法,也可以在綜合排序處為用戶選擇使用了變形加權的最短圖路徑算法。在離線部分,由于圖的節點和邊都較少,可以使用窮舉法來為用戶找到幾種不同類型的最優解。這些算法都是在《算法導論》和《數據結構》中有著詳細討論的算法,書中的每一個算法和數據結構都是作者多年來抽象總結出的通用思路,我稱之為通用類算法。
再說一個最基本的,我們做一個網站允許用戶發布狀態,在高峰期并發量太大,數據庫不堪重負,所以我們需要將用戶的插入記錄先存入到消息隊列中,保證用戶的正常使用,然后再落地到MySQL數據庫中。大家都會想到選擇隊列這樣一種先入先出的數據結構,這也屬于一種算法。
通過上面的幾個例子,你會不會覺得你的身邊處處都是算法?那么到底什么是算法?我們看看標準的定義:能夠對一定規范的輸入,在有限時間內獲得所要求的輸出的一系列指令都叫作算法。這個定義太抽象了,讓我們簡單來說,算法其實就是解決問題的思路和辦法。那么從這一點來說,你還會說算法不重要么?
那么為什么還會有很多學生,甚至已經工作了很久的朋友還會說大學學的東西沒有意義,算法沒有用呢?歸根結底是因為大家不知道為什么學,或者說缺乏算法的場景化。我在讀大學的時候,經常做一些簡單的網站,用到的技術無外乎是最簡單的對數據庫的增刪改查,當時最大的感覺就是算法沒有用。后來隨著工作的深入,我開始逐步地意識到算法的重要性,逐漸地把算法撿了起來。
這本書給我最大的驚喜是沒有像一般的算法書一樣單純地去講算法和數據結構本身,那樣無論語言多風趣,只要一談到關鍵的問題也會馬上變得無趣起來。作者在每一章都給出了一個實際的問題,然后嘗試用算法去解決這一個問題,沒有局限于通用類算法,而是同時涵蓋邏輯類算法、通用類算法和專業類算法,真正是在訓練讀者解決問題的能力,而解決問題的能力,正是任何一家公司所需人才的最核心的技能。
另外,我已經在幻想作者在下一本書里可以把工作中的實際場景列舉出來,更進一步地講述工作中的算法,讓每一個在校學生都可以意識到算法對于未來工作的重要性,也讓每一位從業者拍案叫絕:“原來這個問題可以這樣解!”讓人人談算法,人人寫算法,引發軟件行業的全民算法潮。
黃鑫(飛林沙)
極光推送首席科學家
序三
如果說《啊哈!算法》是算法界的小白書,內容太少看得不過癮,那么這本《算法的樂趣》或許可以帶你一起牛逼一起飛。當我剛拿到書的目錄的時候,我就很期待,因為終于有一本算法書可以系統地和大伙說一說這些我也很想與大伙說的偉大算法。
暴力盲目的搜索算法往往讓計算機顯得很笨甚至有點癡呆,如果你想設計一個“狡猾”的程序,那么本書中的搜索剪枝、A*尋徑、博弈樹以及遺傳算法等將給你帶來啟發??焖俑道锶~變換,這么霸氣而又高大上的名字,其實在我們生活中的應用隨處可見,家中的Wi-Fi、智能手機、電話、路由器等幾乎所有內置計算機系統的東西都會以各種方式使用這個算法。RLE數據壓縮算法,在文檔、視頻、音樂、數據存儲、云計算、數據庫等幾乎所有應用中都有著廣泛的運用。壓縮算法令系統更有效,成本更低。再來說密碼學算法中非常重要的RSA算法,如果沒有這些算法,互聯網就會變得不安全,電子交易就不會如此可信。
好玩的算法還有很多很多,歷法與二十四節氣的計算、華容道、井字棋、黑白棋、五子棋以及俄羅斯方塊……你會驚訝地發現,再簡單不過的事情背后,都藏著算法的神奇背影。不妨將本書放在案頭慢慢品讀,你將能看到算法如何深入我們的日常生活,如何重塑我們的世界。
你準備好了嗎?接下來,這個世界算法將接管一切。
啊哈磊
《啊哈!算法》作者
本書的序和部分試讀章節可在CSDN的資源下載部分下載,以下是本書目錄的三級標題展開:
第1章 程序員與算法
| 閱讀 |
第2章 算法設計的基礎
| ? |
第3章 算法設計的常用思想
| ? |
第4章 阿拉伯數字與中文數字
| ? |
第5章 三個水桶等分8升水的問題
| ? |
第6章 妖怪與和尚過河問題
| ? |
第7章 穩定匹配與舞伴問題
| 閱讀 |
第8章 愛因斯坦的思考題
| ? |
第9章 項目管理與圖的拓撲排序
| ? |
第10章 RLE行程長度壓縮算法與PCX圖像格式
| ? |
第11章 算法與歷法
| ? |
第12章 實驗數據與曲線擬合
| ? |
第13章 非線性方程與牛頓迭代法
| ? |
第14章 計算幾何與計算機圖形學
| ? |
第15章 音頻頻譜和均衡器與傅立葉變換算法
| ? |
第16章 全局最優解與遺傳算法
| ? |
第17章 計算器程序與大整數計算
| ? |
第18章 RSA算法-加密與簽名
| ? |
第19章 數獨游戲
| ? |
第20章 華容道游戲
| ? |
第21章 A*尋徑算法
| ? |
第22章 俄羅斯方塊游戲
| ? |
第23章 博弈樹與棋類游戲
| ? |
附錄A 算法設計的常用技巧
| ? |
附錄B 一個棋類游戲的設計框架
|
總結
以上是生活随笔為你收集整理的《算法的乐趣》终于出版了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 伍迷随想冷饭集 之 瞻前顾后之随想
- 下一篇: C#打造自己的文件浏览器