計算機如何精確地傳輸海量數(shù)據(jù),識別語音和筆跡;智能手機、平板電腦如何在幾分之一秒內(nèi)搜索整個頁面;身處大數(shù)據(jù)時代的我們,究竟該如何應(yīng)對變化莫測的世界。
計算機算法的底層建設(shè)為經(jīng)濟和產(chǎn)業(yè)發(fā)展提供了原始動力。在科技互聯(lián)網(wǎng)時代,使用計算機和科技設(shè)備都不可避免地要依賴計算機科學(xué)的基礎(chǔ)思想,而這些思想都誕生于20世紀。
《改變未來的九大算法》是一本科普讀物,作者致力于將計算機科學(xué)的復(fù)雜思想為大眾做深入淺出的解讀。此書通過簡明的語言和生動的例證,闡述了計算機王國的核心算法:搜索引擎、PageRank、公鑰加密、糾錯碼、圖形識別、數(shù)據(jù)壓縮、數(shù)據(jù)庫、數(shù)字簽名等。在解釋這些算法的同時,作者也向我們展示了充滿科學(xué)原創(chuàng)精神的計算機世界:每一種算法的提出不但拓展了虛擬世界的領(lǐng)域,它同時也是人類智慧的彰顯,可以被廣泛運用于眾多領(lǐng)域,以推動商業(yè)和社會文明的發(fā)展。
★ 計算機科學(xué)導(dǎo)師約翰·麥考密克解讀人工智能誠意之作。
★ 了解機器學(xué)習(xí)的底層邏輯,掌握算法,驅(qū)動智能商業(yè)。
★ 目標讀者:科學(xué)家和工程師,機器學(xué)習(xí)專家,學(xué)生和對科學(xué)感興趣的人
★ 榮獲美國出版商協(xié)會2012年計算機與信息科學(xué)*專業(yè)/學(xué)術(shù)圖書獎。
★ 2010年圖靈獎得主查克·塞克強烈推薦:作者解釋了數(shù)億人每天使用的一些算法,不是如算術(shù)和排序這類簡單的算法,而是更復(fù)雜的事情如何確定網(wǎng)頁的重要性,以及無法被計算的問題。
★ 艾美獎得主(相機軟件開發(fā)者)安德魯·菲茨吉本:長久以來,沒有哪本書能讓我像十幾歲時閱讀霍金和費曼的書時那樣讓我興奮,而這本書做到了,它提醒我為什么我喜歡計算機科學(xué)。
計算機日常運用的卓越思想
計算機科學(xué)中的偉大思想是如何誕生的?以下遴選部分思想進行介紹:
● 20世紀30年代,在第一臺數(shù)字計算機被發(fā)明以前,一位英國天才開創(chuàng)了計算機科學(xué)研究領(lǐng)域。之后,這位天才還繼續(xù)證明了,不管未來建造的計算機運行多快、功能多強大、設(shè)計得多好,仍舊有一些問題將是計算機不能解決的。
● 1948年,一位供職于電話公司的科學(xué)家發(fā)表了一篇論文,由此開創(chuàng)了信息理論研究領(lǐng)域。這位科學(xué)家的工作讓計算機能以完美的精確度傳輸信息,即便大部分數(shù)據(jù)都因為被干擾而遭受破壞。
● 1956年,一群學(xué)者在達特茅斯(Dartmouth)舉行會議。這次會議的目標很清晰,也很大膽,那就是開創(chuàng)人工智能領(lǐng)域的研究。在取得了許多重大成功,也經(jīng)歷了無數(shù)次失望之后,我們?nèi)云诖霈F(xiàn)一個真正的智能計算機程序。
● 1969年,IBM(國際商業(yè)機器公司)的一名研究人員發(fā)明了一種在數(shù)據(jù)庫中組織信息的先進方法。目前,絕大多數(shù)在線交易都使用該技術(shù)存儲及檢索信息。
● 1974 年,英國政府秘密通信實驗室的研究人員發(fā)明了一種讓計算機實現(xiàn)安全通信的方法,即另一臺計算機可以查看在計算機之間交換的所有信息。這些研究人員為政府保密所限不過幸運的是,三名美國專家獨立開發(fā)并拓展了這項重大發(fā)明,為互聯(lián)網(wǎng)上所有的安全通信打下了基礎(chǔ)。
● 1996 年,斯坦福大學(xué)的兩名博士生決定聯(lián)手搭建一個互聯(lián)網(wǎng)搜索引擎。幾年后,他們創(chuàng)辦了谷歌公司互聯(lián)網(wǎng)時代的第一個數(shù)字巨頭。
我們在享受21 世紀技術(shù)驚人增長的同時,使用計算機設(shè)備不管是現(xiàn)有最強大的一組機器,還是最新、最時尚的手持設(shè)備不可避免地要依賴計算機科學(xué)的基礎(chǔ)思想,而這些思想都誕生于20 世紀。想一想:你今天做過什么令人印象深刻的事情嗎?好吧,這個問題的答案取決于你怎么看。也許是你搜索了包含數(shù)十億份文檔的資料庫,
從中選出兩三份與你的需求最相關(guān)的文檔?即便有能夠影響所有電子設(shè)備的電磁干擾,你在存儲或傳輸數(shù)百萬條信息的過程中,也沒犯一點兒錯誤?你是否成功地完成了一次在線交易,即便同時有成千上萬名消費者在訪問同一個服務(wù)器?你是否在能夠被其他數(shù)十臺計算機嗅探到的線路中傳輸了一些機密信息(比如信用卡卡號)?你是否運用過壓縮的魔力,將數(shù)兆的照片壓縮成更易于管理的大小,以便附在電子郵件中發(fā)送?你是否在手持設(shè)備上觸發(fā)了人工智能,以自動糾正你在手持設(shè)備的小巧鍵盤上輸入的內(nèi)容?
這些令人印象深刻的壯舉都有賴于之前提到的偉大發(fā)明或發(fā)現(xiàn)。然而,絕大多數(shù)計算機用戶每天都會多次運用這些天才的想法,卻從沒有意識到!本書旨在向大眾解釋這些觀點我們每天使用的計算機科學(xué)的偉大思想。在解釋每一個觀點時,我都假設(shè)讀者不了解有關(guān)計算機科學(xué)的任何知識。
算法:指尖精靈的構(gòu)件
到目前為止,我一直在談計算機科學(xué)的偉大思想,但計算機科學(xué)家們會將許多重要思想形容為算法。那么思想和算法之間有什么區(qū)別?究竟什么是算法?這一問題最簡單的答案是,算法是一張精確的處方,它按順序詳細列出了解決一個問題所需要的具體步驟。我們小時候在學(xué)校學(xué)到的一種算法就是很好的例子:將兩個大數(shù)字相加的算法。如下例所示。這個算法涉及一連串的步驟,開始的步驟如下:首先,將兩個數(shù)的最末位數(shù)相加,寫下結(jié)果的最末位數(shù),將剩下的數(shù)放到左側(cè)的下一欄;接著,將下一欄的數(shù)相加,再將除了結(jié)果末位數(shù)的數(shù)字和前一欄余下的數(shù)相加……依此類推。
請注意算法步驟近乎機械化的感覺。事實上,這是算法的關(guān)鍵特點之一:每步都必須絕對精確,沒有任何人類意圖或推測摻雜其中。這樣,每個完全機械化的步驟才能被編入計算機。算法的另一個重要特點是,不管輸入什么,算法總能運行。我們在學(xué)校學(xué)到的相加算法就擁有這一特性:不管你想把哪兩個數(shù)相加,運用算法最終都會得出正確答案。比如,用這一算法將兩個長達1 000 位的數(shù)相加,你肯定能得到答案,盡管這需要相當長的時間。
對把算法定義為一張精確的機械化的處方的說法,你也許會略感好奇。這張?zhí)幏骄烤挂嗑_?要進行哪些基本操作?比如,在上面的相加算法中,簡單地說一句把兩個數(shù)相加是不是就行了?
還是說我們要在加法表上列出所有位的數(shù)字?這些細節(jié)看起來也許有點兒乏味,甚至?xí)@得有點兒學(xué)究氣,但它們其實離真相不遠了: 這些問題的真正答案正處于計算機科學(xué)的核心,并且也和哲學(xué)、物理學(xué)、神經(jīng)科學(xué)及遺傳學(xué)有聯(lián)系。有關(guān)算法究竟是什么的深層問題都歸結(jié)于一個前提眾所周知的邱奇
圖靈論題(Church-Turing thesis)。我們將在第九章重溫這些問題,屆時我們還將討論計算的理論極限,以及邱奇
圖靈論題的一些方面。同時,將算法比作一張非常精確的處方這一非正式觀點,其效果會非常好。
現(xiàn)在我們知道了什么是算法,但算法和計算機有什么聯(lián)系呢?關(guān)鍵在于,計算機需要用非常精確的指令編程。因此,在能讓計算機為我們解決某個特定問題之前,我們需要為那個問題開發(fā)一種算法。在數(shù)學(xué)和物理學(xué)等其他學(xué)科中,重要的結(jié)果通常是由一個方程式獲得的。(著名的例子包括勾股定理a2 b2=c2 或愛因斯坦的質(zhì)量守恒定理E = mc2。)相反,計算機科學(xué)的偉大思想通常是來形容如何解決一個問題的當然,是使用一種算法。因此,本書的主要目的是,解釋讓計算機成為你的個人天賦的東西計算機每天使用的偉大算法。
一種偉大的算法由什么構(gòu)成?
這會引出一個刁鉆的問題:什么才是真正偉大的算法?潛在的候選算法清單相當長,但我用幾條基本標準縮減了用于本書的候選算法清單。第一條也是最重要的一條標準是,偉大的算法要被普通計算機用戶每天用到。第二條重要的標準是,偉大的算法應(yīng)該能處理具體的現(xiàn)實問題,如壓縮一個特定文件或通過一個噪鏈精確地傳輸文件。對已經(jīng)了解部分計算機科學(xué)的讀者而言,第XIII頁文字框中的內(nèi)容將解釋前面兩大標準的部分后果。
第三個標準是,算法主要和計算機科學(xué)理論相關(guān)。這排除了主要和計算機硬件如CPU(中央處理器)、監(jiān)視器,以及網(wǎng)絡(luò)有關(guān)的技術(shù)。這條標準也減輕了對基礎(chǔ)設(shè)施如互聯(lián)網(wǎng)設(shè)計的重視。為什么我要著重于計算機科學(xué)理論?部分原因是公眾對計算機科學(xué)認知的不平衡:有一種廣泛的觀點認為,計算機科學(xué)基本上就是編程(如軟件)和設(shè)備設(shè)計(如硬件)。事實上,最美妙的計算機科學(xué)思想中有許多是十分抽象的,并不屬于以上任意一類。我希望通過強調(diào)這些理論思想,讓更多人將計算機科學(xué)作為一門知識學(xué)科來理解。
你也許已經(jīng)注意到了,我列出的標準可能會遺漏一些偉大的算法,但我從一開始就避免了定義偉大這個極其麻煩的問題。針對這一問題,我依賴于自己的直覺。在本書說明的每種算法中,其核心都是一個讓整件事情奏效的精巧把戲(trick)。對我而言,當這個把戲顯露出來時,那個啊哈時刻(即ahamoment,指用戶體驗產(chǎn)品時眼前一亮的那一刻)會讓解釋這些算法成為令人愉悅的經(jīng)歷,我希望你也能有此感受。我會用到把戲這個詞很多次,需要指出的是,我并非指那些卑劣或騙人的把戲孩子可能會用在弟弟或妹妹身上的那種把戲。相反,本書中的把戲類似于交易訣竅或魔術(shù):為達成目標而采用的聰明技巧,否則目標很難達成或根本不可能達成。
因此,根據(jù)直覺,我選出了自認為是計算機科學(xué)世界中最精巧、最神奇的把戲。在英國數(shù)學(xué)家高德菲·哈羅德·哈代(G.
H. Hardy) 的《一個數(shù)學(xué)家的辯白》(A Mathematicians Apology)中,作者試圖向公眾解釋數(shù)學(xué)家從事數(shù)學(xué)的原因美是第一道測試:丑陋的數(shù)學(xué)在這個世界中無永存之地。這道美的測試也適用于在計算機科學(xué)中蘊含的理論思想。因此,選取在本書中出現(xiàn)的算法的最后一條標準,就是哈代的也許可以這么稱呼美的測試:我希望至少能成功地向讀者展示部分美我在每種算法中感受到的美。
第一條標準要被普通計算機用戶每天用到排除了主要由計算機專業(yè)人士使用的算法,如編譯器和程序驗證技術(shù)。第二條標準解決某個特定問題的具體程序排除了許多作為計算機科學(xué)本科課程核心內(nèi)容的偉大算法,如排序算法(快速排序等)、圖形算法(迪杰斯特拉最短路徑算法等)、數(shù)據(jù)結(jié)構(gòu)(哈希表等)。這些算法的偉大性毋庸置疑,而且很輕易地就滿足了第一條標準,因為普通用戶使用的絕大多數(shù)應(yīng)用程序都會反復(fù)應(yīng)用這些算法。但這些算法太通用了:它們能被用來解決眾多問題。在本書中,我決定要專注于解決特定問題的算法,因為對普通計算機用戶而言,這些算法能讓他們擁有更清晰的動機。
接下來我將談?wù)勥x擇展示的這些算法。搜索引擎的巨大影響, 也許是算法技術(shù)影響所有計算機用戶最明顯的例子,我自然也將部分互聯(lián)網(wǎng)搜索的核心算法收在了本書中。第一章描述了搜索引擎如何使用索引尋找與請求匹配的文件,而第二章則解釋了網(wǎng)頁排名(PageRank)算法谷歌公司為保證匹配度最高的文件出現(xiàn)在搜索結(jié)果列表頂部的原始算法。
即便我們不經(jīng)常想這件事情,絕大多數(shù)人也能意識得到,為提供出人意料的強大搜索結(jié)果,搜索引擎會落實一些深邃的計算機科學(xué)思想。相反,其他一些偉大的算法也經(jīng)常被用到,但計算機用戶對此甚至都沒有意識到。第三章描述的公鑰加密(Public Key Cryptography) 就是這樣一種算法。用戶每次訪問一個安全網(wǎng)站(地址以https而非http開頭),都會用到公鑰加密的一個方面眾所周知的密鑰交換(key exchange)來展開一段安全對話。第三章就是在解釋密鑰交換過程的實現(xiàn)原理。
第四章的主題是糾錯碼(Error Correcting Codes),這是我們經(jīng)常使用但沒有意識到的另一類算法。事實上,糾錯碼極有可能是有史以來唯一一種使用次數(shù)最頻繁的偉大算法。糾錯碼可以讓計算機識別并糾正在儲存或傳輸數(shù)據(jù)時出現(xiàn)的錯誤,而不必依靠備份或再次傳輸。
糾錯碼無處不在:它們被用于所有硬盤驅(qū)動器、眾多網(wǎng)絡(luò)傳輸、CD (數(shù)字光盤)和DVD(高密度數(shù)字視頻光盤),甚至還存在于一些計算機的內(nèi)存中。不過,糾錯碼的能力太強了,以至于我們意識不到它們的存在。
第五章稍微有點兒特殊,它介紹的是圖形識別算法(Pattern Recognition Algorithm)。圖形識別算法也能進入偉大的計算機科學(xué)思想榜單,但它違背了第一條標準:要被普通計算機用戶每天用到。圖形識別屬于計算機識別高度可變信息如筆跡、講話和人臉的技術(shù)。事實上,在21 世紀的第一個十年里,絕大多數(shù)日常計算并沒有用到這些技術(shù)。但在2010 年,圖形識別的重要性急劇增大:配備小型屏幕鍵盤的移動設(shè)備需要自動糾錯,平板設(shè)備必須識別手寫輸入,而且所有這些設(shè)備(特別是智能手機)越來越趨向于語音操作。一些網(wǎng)站甚至使用圖形識別來決定向用戶展示哪種廣告。另外,
我對圖形識別也有偏好,因為它是我的研究領(lǐng)域。因此,第五章描述了三種最有趣、最成功的圖形識別技術(shù):最近鄰分類器(Nearest-neighbor
Classifier)、決策樹(Decision Tree),以及神經(jīng)網(wǎng)絡(luò)(Neural Network)。
第六章討論了壓縮算法。壓縮算法組成了另一組使計算機變成我們指尖精靈的偉大思想。計算機用戶的確會時不時地直接進行壓縮,也許是為了節(jié)省磁盤空間,也許是為了縮減照片容量,以便用電子郵件發(fā)出。不過在私底下,壓縮使用的頻率要更高:我們根本沒有意識到,我們的下載或上傳也可以通過壓縮以節(jié)省帶寬,而數(shù)據(jù)中心通常會壓縮消費者的數(shù)據(jù)以降低成本。電子郵件提供商提供給你的5 GB(計算機存儲單位)空間,經(jīng)壓縮后很有可能只占據(jù)電子郵件提供商5 GB空間的很小一部分。
第七章講到了數(shù)據(jù)庫中運用的一些基礎(chǔ)算法。這一章側(cè)重為實現(xiàn)一致性指一個數(shù)據(jù)庫中的關(guān)系不互相沖突而采用的聰明技巧。沒有這些精巧的技術(shù),我們的絕大部分在線生活[包括網(wǎng)絡(luò)購物以及通過Facebook(臉書)之類的社交網(wǎng)站進行互動]就會消亡于眾多計算機錯誤中。這一章解釋了一致性真正的問題是什么,以及計算機科學(xué)家是如何解決這一問題的。前提是不犧牲我們所期望的在線系統(tǒng)擁有的高效性。
在第八章,我們會了解理論計算機科學(xué)無可爭議的瑰寶之一:數(shù)字簽名。乍看之下,用數(shù)字形式簽署一份電子文檔似乎不可能。你也許會想,這種簽名必須由數(shù)字信息組成,而任何想要偽造簽名的人都可以毫不費力地拷貝這些信息。這一悖論的解決方案,就是計算機科學(xué)取得的最令人矚目的成就之一。
第九章采取了截然不同的視角:與其描述一種已經(jīng)存在的偉大算法,我們不如去了解一種假如存在則必然會偉大的算法。不過我們會震驚地發(fā)現(xiàn),這種特別偉大的算法不可能存在。這表明計算機解決問題的能力存在絕對極限,而我們將簡單地從哲學(xué)和生物學(xué)角度探討這一結(jié)果的應(yīng)用。
在結(jié)語部分,我們會總結(jié)偉大算法的一些共性,花些時間暢想未來會怎樣。會有更多偉大算法出現(xiàn)嗎?或者說,我們已經(jīng)發(fā)現(xiàn)了所有偉大的算法?
在此,不得不提前說一下本書的風(fēng)格。任何科普作品都必須清楚地告知讀者信息來源,但引用會破壞文本的流暢性,并讓讀者產(chǎn)生閱讀學(xué)術(shù)著作的感覺。由于可讀性和易讀性是本書的首要目標,所以本書正文不會出現(xiàn)引用。不過,我清楚地記錄了所有來源,并在本書末尾的注釋板塊中列出,還時不時地附上拓展評論。這個板塊還列出了一些額外材料,以便感興趣的讀者能去尋找更多和計算機科學(xué)中偉大算法有關(guān)的信息。
為什么我們要關(guān)注這些偉大的算法?
希望對這些迷人思想的快速總結(jié)能讓你渴望深入了解它們的運行方式。不過,也許你仍然在思考:本書的終極目標是什么?讓我簡短地介紹一下本書的真正目的。這本書絕不是一本問答式操作手冊。在讀完本書后,你不會成為計算機安全方面的專家,也不會成為人工智能或其他領(lǐng)域的專家。你也許能學(xué)到一些有用的技能,這倒是真的。比如:你會對如何檢查安全網(wǎng)站憑證以及已簽名軟件包了解更多;你能在有損和無損壓縮之間針對不同任務(wù)做出明智選擇;通過理解搜索引擎索引和排名技術(shù)的某些方面,你能更高效地使用搜索引擎。
然而,這些相對于本書真正的目的不過是微小的紅利。在讀完本書后,你不會成為一名更加熟練的計算機用戶,但你會更加珍視每天在所有計算設(shè)備上不停使用的思想的美。
為什么這是件好事?我用類比的方式來說明。我肯定不是一位天文學(xué)專家事實上,我在這個領(lǐng)域里相當無知,我想知道更多。但每當我注視夜空時,我知道的少量天文學(xué)知識增強了我此刻的享受。有時,我對所見事物的理解,讓我產(chǎn)生了一種滿足和驚奇的感覺。希望在讀完本書后,你在使用計算機時也能經(jīng)常獲得同樣的滿足和驚奇之感,這也是我殷切的希望。你將真正珍視我們時代最常見、最神秘的黑盒子:你的個人電腦,你指尖的精靈。
約翰·麥考密克(John MacCormick),計算機科學(xué)的領(lǐng)頭人和導(dǎo)師。牛津大學(xué)博士,曾在惠普和微軟從事研究工作,F(xiàn)任迪金森學(xué)院計算機學(xué)科的教授。多項專利所有者。
推薦序 計算機的算法之美
克里斯·畢曉普
前言
計算機日常運用的卓越思想
第一章 搜索引擎索引在世界上最大的草垛中尋針
搜索引擎對我們的生活產(chǎn)生了深遠影響。絕大多數(shù)人每天都進行多次搜索查詢,但我們極少會停下來思考這個令人驚嘆的工具是如何奏效的。
第二章 PageRank讓谷歌騰飛的技術(shù)
搜索引擎和網(wǎng)絡(luò)垃圾制造者在進行一場軍備競賽。搜索引擎不斷嘗試完善算法,以便返回真實排名。
第三章 公鑰加密用明信片傳輸秘密
人們喜歡傳謠,也喜歡了解秘密。而由于加密的目的就是傳輸秘密,所以我們都是天生的密碼員。但人類進行秘密溝通要比計算機容易。本章將探究計算機的加密源頭。
第四章 糾錯碼自糾正的錯誤
沒有糾錯碼,我們的計算機和通信系統(tǒng)會比現(xiàn)在慢很多,功能上弱許多,可靠性也會差很多。下次你在周末享受高清衛(wèi)星電視時,不妨遐思一下這個令人回味的反諷:正是由于理查德·漢明在周末與早期計算機的斗爭中產(chǎn)生了困擾,才有了我們現(xiàn)在周末的娛樂。
第五章 圖形識別從經(jīng)驗中學(xué)習(xí)
圖形識別是人工智能的一部分,包括面部識別、物體識別、語音識別和筆跡識別等任務(wù)。本章描述的算法最近鄰分類器、決策樹和神經(jīng)網(wǎng)絡(luò),它們是圖形識別系統(tǒng)的一些基礎(chǔ)構(gòu)件。不管你是否認為它們是真正的智能,你都將在未來數(shù)年中看到更多這些算法。
第六章 數(shù)據(jù)壓縮有益無害
幾乎所有軟件都是以壓縮格式被下載這意味著你下載和轉(zhuǎn)移文件的速度,要比不壓縮時快數(shù)倍。甚至當你對著電話講話時,你的聲音也經(jīng)過了壓縮:如果電話公司能在傳輸語音數(shù)據(jù)前進行壓縮,它們就能對自己的資源實現(xiàn)超高利用率。
第七章 數(shù)據(jù)庫追求一致性的征程
我們將了解數(shù)據(jù)庫背后三種美麗的基礎(chǔ)思想:預(yù)寫日志記錄(write-ahead logging)、兩階段提交
(two-phase commit)和關(guān)系數(shù)據(jù)庫(relational
database)。這些思想讓存儲特定種類重要信息的數(shù)據(jù)庫技術(shù)占據(jù)了絕對的主宰地位。
第八章 數(shù)字簽名這個軟件究竟由誰編寫
沒有數(shù)字簽名,我們所知的互聯(lián)網(wǎng)就不會存在。數(shù)據(jù)仍可以通過加密安全交換,但要驗證接收數(shù)據(jù)的來源就要困難得多。這一偉大思想和如此廣泛的實際影響相結(jié)合,無疑讓數(shù)字簽名成為計算機科學(xué)中最偉大的成就之一。
第九章
什么可以計算有些程序不可能存在
有些問題根本不可能通過計算機解決,不管計算機有多強大或人類程序員有多聰明。這些不可判定問題包括潛在的有用任務(wù),如分析其他程序以發(fā)現(xiàn)它們是否會崩潰。
結(jié)語 更多在你指尖的精靈
致 謝
注 釋