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