演算法的力量 文 李開復

2021-09-25 03:59:15 字數 4676 閱讀 1981

演算法的力量 文

/李開復

演算法是電腦科學領域最重要的基石之一,但卻受到了國內一些程式設計師的冷落。許多學生

看到一些公司在招聘時要求的程式語言五花八門就產生了一種誤解,認為學計算機就是學

各種程式語言,或者認為,學習最新的語言、技術、標準就是最好的鋪路方法。其實大家

都被這些公司誤導了。程式語言雖然該學,但是學習計算機演算法和理論更重要,因為計算

機演算法和理論更重要,因為計算機語言和開發平台日新月異,但萬變不離其宗的是那些算

法和理論,例如資料結構、演算法、編譯原理、計算機體系結構、關係型資料庫原理等等。在「

開復學生網

」上,有位同學生動地把這些基礎課程比擬為「內功

」,把新的語言、技

術、標準比擬為「外功

」。整天趕時髦的人最後只懂得招式,沒有功力,是不可能成為高

手的。演算法與我

當我在1980

年轉入電腦科學系時,還沒有多少人的專業方向是電腦科學。有許多其他

系的人嘲笑我們說:

「知道為什麼只有你們系要加乙個『科學

』,而沒有

『物理科學系』或

『化學科學系

』嗎?因為人家是真的科學,不需要畫蛇添足,而你們自己心虛,生怕不『科學

』,才這樣欲蓋彌彰。

」其實,這點他們徹底弄錯了。真正學懂計算機的人(不只是「

程式設計匠」

)都對輸血有相當的造詣,既能用科學家的嚴謹思維來求證,也能用工程師

的務實手段來解決問題

——而這種思維和手段的最佳演繹就是「演算法

」。記得我讀博時寫的

othello

對弈軟體獲得了世界冠軍。當時,得第二名的人認為我是靠僥

幸才打贏他,不服氣地問我的程式平均每秒能搜尋多少步棋,當他發現我的軟體在搜尋效

率上比他快

60多倍時,才徹底服輸。為什麼在同樣的機器上,我可以多做

60倍的工作呢?

這是因為我用了乙個最新的演算法,能夠把乙個指數函式轉換成四個近似的表,只要用常數

時間就可得到近似的答案。在這個例子中,是否用對演算法才是能否贏得世界冠軍的關鍵。

還記得1988

語音識別系統比我開發的慢幾十倍,而且,在擴大至大詞彙系統後,速度差異更有幾百倍

之多。他們雖然買了幾台超級計算機,勉強讓系統跑了起來,但這麼貴的計算資源讓他們

的產品部門很反感,因為「昂貴

」的技術是沒有應用前景的。在與他們**的過程中,我

驚訝地發現乙個

o(n*m)

的動態規劃

(dynamic programming)

居然被他們做成了

o(n*n*m)

。更驚訝的是,他們還為此發表了不少文章,甚至為自己的演算法起了乙個很特別的名字,並

將演算法提名到乙個科學會議裡,希望能得到大獎。當時,貝爾實驗室的研究員當然絕頂聰

明,但他們全都是學數學、物理或電機出身,從未學過電腦科學或演算法,才犯了這麼基

本的錯誤。我想那些人以後再也不會嘲笑學電腦科學的人了吧!

網路時代的演算法

有人也許會說:

「今天計算機這麼快,演算法還重要嗎?

」其實永遠不會有太快的計算機,

因為我們總會想出新的應用。雖然在摩爾定律的作用下,計算機的計算能力每年都在飛快

增長,**也在不斷下降。可我們不要忘記,需要處理的資訊量更是呈指數級的增長。現

儲手段使我們每個人的資訊量都在**式的增長。網際網路的資訊流量和日誌容量也在飛快

增長。在科學研究方面,隨著研究手段的進步,資料量更是達到了前所未有的程度。無論

是三維圖形、海量資料處理、機器學習、語音識別,都需要極大的計算量。在網路時代,

越來越多的挑戰需要靠卓越的演算法來解決。

再舉另乙個網路時代的例子。在網際網路和手機搜尋,如果要找附近的咖啡店,那麼搜尋引

擎該怎麼處理這個請求呢?

最簡單的辦法就是把整個城市的咖啡館都找出來,然後計算出它們的所在位置與你之間的

距離,再進行排序,然後返回最近的結果。但該如何計算距離呢?圖論裡有不少演算法可以

解決這個問題。

這麼做也許是最直觀的,但絕對不是最迅速的。如果乙個城市只有為數不多的咖啡館,那

麼這麼做應該沒什麼問題,反正計算量不大。但如果乙個城市裡有很多咖啡館,又有很多

使用者都需要類似的搜尋,那麼伺服器所承受的壓力就大多了。在這種情況下,我們該怎樣

優化演算法呢?

首先,我們可以把整個城市的咖啡館做一次

「預處理

」。比如,把乙個城市分成若干個「格仔

(grid)」

,然後根據使用者所在的位置把他放到某乙個格仔裡,只對格仔裡的咖啡館

進行距離排序。

問題又來了,如果格仔大小一樣,那麼絕大多數結果都可能出現在市中心的乙個格仔裡,

而郊區的格仔裡只有極少的結果。在這種情況下,我們應該把市中心多分出幾個格仔。更

進一步,格仔應該是乙個

「樹結構

」,最頂層是乙個大格

——整個城市,然後逐層下降,

格仔越來越小,這樣有利於使用者進行精確搜尋

——如果在最底層的格仔裡搜尋結果不多,

使用者可以逐級上公升,放大搜尋範圍。

上述演算法對咖啡館的例子很實用,但是它具有通用性嗎?答案是否定的。把咖啡館抽象一

下,它是乙個「點

」,如果要搜尋乙個「面

」該怎麼辦呢?比如,使用者想去乙個水庫玩,

而乙個水庫有好幾個入口,那麼哪乙個離使用者最近呢?這個時候,上述

「樹結構

」就要改

成「r-tree」

,因為樹中間的每乙個節點都是乙個範圍,乙個有邊界的範圍(參考

: )。

通過這個小例子,我們看到,應用程式的要求千變萬化,很多時候需要把乙個複雜的問題

分解成若干簡單的小問題,然後再選用合適的演算法和資料結構。

並行演算法:

google

的核心優勢

上面的例子在

google

裡就要算是小

case

了!每天

google

的**要處理十億個以上的搜尋,

gmail

要儲存幾千萬使用者的

2g郵箱,

google earth

要讓數十萬使用者同時在整個地球上遨遊

,並將合適的經過網際網路提交給每個使用者。如果沒有好的演算法,這些應用都無法成為

現實。在這些的應用中,哪怕是最基本的問題都會給傳統的計算帶來很大的挑戰。例如,每天都

有十億以上的使用者訪問

google

的**,使用

google

的服務,也產生很多很多的日誌

(log)

。因為log

每份每秒都在飛速增加,我們必須有聰明的辦法來進行處理。我曾經在面試中

問過關於如何對

log進行一些分析處理的問題,有很多面試者的回答雖然在邏輯上正確,

但是實際應用中是幾乎不可行的。按照它們的演算法,即便用上幾萬臺機器,我們的處理速

度都根不上資料產生的速度。

那麼google

是如何解決這些問題的?

首先,在網路時代,就算有最好的演算法,也要能在平行計算的環境下執行。在

google

的資料中心,我們使用的是超大的並行計算機。但傳統的並行演算法執行時,效率會在增加機器

數量後迅速降低,也就是說,十臺機器如果有五倍的效果,增加到一千台時也許就只有幾

十倍的效果。這種事半功倍的代價是沒有哪家公司可以負擔得起的。而且,在許多並行算

法中,只要乙個結點犯錯誤,所有計算都會前功盡棄。

那麼google

是如何開發出既有效率又能容錯的平行計算的呢?

google

最資深的計算機科學家

jeff dean

認識到,

google

所需的絕大部分資料處理都可以

歸結為乙個簡單的並行演算法:

map and reduce

(。這個演算法能夠在很多種計算中達到

相當高的效率,而且是可擴充套件的(也就是說,一千臺機器就算不能達到一千倍的效果,至

少也可以達到幾百倍的效果)。

map and reduce

的另外一大特色是它可以利用大批廉價的

機器組成功能強大的

server farm

。最後,它的容錯性能異常出色,就算乙個

server farm

宕掉一半,整個

fram

依然能夠執行。正是因為這個天才的認識,才有了

map and reduce

演算法。借助該演算法,

google

幾乎能無限地增加計算量,與日新月異的網際網路應用一同成長。

演算法並不侷限於計算機和網路

舉乙個計算機領域外的例子:在高能物理研究方面,很多實驗每秒鐘都能幾個

tb的資料量

。但因為處理能力和儲存能力的不足,科學家不得不把絕大部分未經處理的資料丟棄掉。

可大家要知道,新元素的資訊很有可能就藏在我們來不及處理的資料裡面。同樣的,在其

他任何領域裡,演算法可以改變人類的生活。例如人類基因的研究,就可能因為演算法而發明

新的醫療方式。在****領域,有效的演算法可能避免下乙個

911的發生。在氣象方面,

演算法可以更好地**未來天災的發生,以拯救生命。

所以,如果你把計算機的發展放到應用和資料飛速增長的大環境下,你一定會發現;演算法

的重要性不是在日益減小,而是在日益加強。

演算法的力量 李開復

通過這個小例子,我們看到,應用程式的要求千變萬化,很多時候需要把乙個複雜的問題分解成若干簡單的小問題,然後再選用合適的演算法和資料結構。並行演算法 google的核心優勢 上面的例子在google裡就要算是小case了!每天google的 要處理十億個以上的搜尋,gmail要儲存幾千萬使用者的2g郵...

演算法的力量 李開復

程式語言雖然該學,但是學習計算機演算法和理論更重要,因為計算機演算法和理論更重要,因為計算機語言和開發平台日新月異,但萬變不離其宗的是那些演算法和理論,例如資料結構 演算法 編譯原理 計算機體系結構 關係型資料庫原理等等 演算法是電腦科學領域最重要的基石之一,但卻受到了國內一些程式設計師的冷落。許多...

演算法的力量 李開復

李開復 演算法的力量 網路時代的演算法並行演算法 google的核心優勢 上面的例子在google裡就要算是小case了!每天google的 要處理十億個以上的搜尋,gmail要儲存幾千萬使用者的2g郵箱,google earth要讓數十萬使用者同時在整個地球上遨遊,並將合適的經過網際網路提交給每個...