李開復:該算法的重要性



算法是計算機科學中最重要的基石之一,可是,國內多家程序猿冷落。html

不少學生看到一些公司在招聘時要求的編程語言五花八門就產生了一種誤解, 以爲學計算機就是學各類編程語言,或者以爲,學習最新的語言、技術、標準就是最好的鋪路方法。面試

事實上你們都被這些公司誤導了。算法

編程語言儘管該學,但是學習計 算機算法和理論更重要。因爲計算機算法和理論更重要。因爲計算機語言和開發平臺突飛猛進,但萬變不離其宗的是那些算法和理論,好比數據結構、算法、編譯原 理、計算機體系結構、關係型數據庫原理等等。數據庫

在「開復學生網」上,有位同窗生動地把這些基礎課程比擬爲「內功」,把新的語言、技術、標準比擬爲「外功」。 成天趕時髦的人最後僅僅懂得招式。沒有功力,是不可能成爲高手的。編程

算法與我 安全

  當我在1980年轉入計算機科學系時,尚未多少人的專業方向是計算機科學。有更多系的人嘲笑咱們說:「知道爲何僅僅有大家系要加一個‘科 學 ’,而沒有‘物理科學系’或‘化學科學系’嗎?因爲人家是真的科學。不需要多此一舉。而大家本身心虛。生怕不‘科學’,才這樣此地無銀三百兩。」事實上。這點他們 完全弄錯了。真正學懂計算機的人(不只僅是「編程匠」)都對數學有至關的造詣,既能用科學家的嚴謹思惟來求證。也能用project師的務實手段來解決這個問題——而這樣的 思惟和手段的最佳演繹就是「算法」。網絡

  記得我讀博時寫的Othello對弈軟件得到了世界冠軍。當時,得第二名的人以爲我是靠僥倖纔打贏他,不服氣地問個人程序平均每秒能搜索多少步 棋。當他發現個人軟件在搜索效率上比他快60多倍時。才完全服輸。爲何在相同的機器上,我能夠多作60倍的工做呢?這是因爲我用了一個最新的算法。能夠 把一個指數函數轉換成四個近似的表,僅僅要用常數時間就可獲得近似的答案。數據結構

在這個樣例中。是否用對算法纔是是否能贏得世界冠軍的關鍵。機器學習

  還記得1988年貝爾實驗室副總裁親自來訪問個人學校,目的就是爲了想了解爲何他們的語音識別系統比我開發的慢幾十倍。而且,在擴大至大詞彙 系統後,速度差別更有幾百倍之多。他們儘管買了幾臺超級計算機。勉強讓系統跑了起來,但這麼貴的計算資源讓他們的產品部門很是反感,因爲「昂貴」的技術是沒 有應用前景的。編程語言

在與他們探討的過程當中,我吃驚地發現一個O(n*m)的動態規劃(dynamic?programming)居然被他們作成了O (n*n*m)。

更吃驚的是,他們還爲此發表了很多文章,甚至爲本身的算法起了一個很是特別的名字,並將算法提名到一個科學會議裏,但願能獲得大獎。

當時。 貝爾實驗室的研究員固然絕頂聰明,但他們全都是學數學、物理或電機出身,從未學過計算機科學或算法,才犯了這麼主要的錯誤。

我想那些人之後不再會嘲笑學 計算機科學的人了吧!

網絡時代的算法

  有人或許會說:「今天計算機這麼快。算法還重要嗎?」事實上永遠不會有太快的計算機,因爲咱們總會想出新的應用。儘管在摩爾定律的做用下。計算機 的計算能力每一年都在飛快增加。價格也在不斷降低。可咱們不要忘記,需要處理的信息量更是呈指數級的增加。

現在每人天天都會創造出大量數據(照片,視頻。語 音。文本等等)。日益先進的紀錄和存儲手段使咱們每個人的信息量都在爆炸式的增加。互聯網的信息流量和日誌容量也在飛快增加。在科學研究方面,隨着研究手 段的進步,數據量更是達到了史無前例的程度。無論是三維圖形、海量數據處理、機器學習、語音識別,都需要極大的計算量。在網絡時代。愈來愈多的挑戰需要靠 卓越的算法來解決。

  再舉還有一個網絡時代的樣例。在互聯網和手機搜索,假設要找附近的咖啡店,那麼搜索引擎該怎麼處理這個請求呢?最簡單的辦法就是把整個城市的咖啡 館都找出來。而後計算出它們的所在位置與你之間的距離,再進行排序,而後返回近期的結果。但該怎樣計算距離呢?圖論裏有很多算法可以解決問題。

  這麼作或許是最直觀的,但絕對不是最迅速的。

假設一個城市僅僅有爲數很少的咖啡館,那麼這麼作應該沒什麼問題,反正計算量不大。

但假設一個城市裏有很是多咖啡館,又有很是多用戶都需要相似的搜索,那麼server所承受的壓力就大多了。

在這樣的狀況下,咱們該如何優化算法呢?

  首先,咱們可以把整個城市的咖啡館作一次「預處理」。

比方,把一個城市分紅若干個「格子(grid)」,而後依據用戶所在的位置把他放到某一個格子裏。僅僅對格子裏的咖啡館進行距離排序。

  問題又來了,假設格子大小同樣。那麼絕大多數結果均可能出現在市中心的一個格子裏,而郊區的格子裏僅僅有極少的結果。

在這樣的狀況下,咱們應該把市 中心多分出幾個格子。更進一步,格子應該是一個「樹結構」,最頂層是一個大格——整個城市,而後逐層降低,格子愈來愈小。這樣有利於用戶進行精確搜索—— 假設在最底層的格子裏搜索結果很少,用戶可以逐級上升,放大搜索範圍。

  上述算法對咖啡館的樣例很是有用。但是它具備通用性嗎?答案是否認的。把咖啡館抽象一下。它是一個「點」,假設要搜索一個「面」該怎麼辦呢?比 如,用戶想去一個水庫玩。而一個水庫有好幾個入口,那麼哪個離用戶近期呢?這個時候,上述「樹結構」就要改爲「r-tree」,因爲樹中間的每一個節點 都是一個範圍,一個有邊界的範圍(參考:http://www.cs.umd.edu/~hjs/rtrees/index.html )。

  經過這個小樣例。咱們看到。應用程序的要求變幻無窮,很是多時候需要把一個複雜的問題分解成若干簡單的小問題,而後再選用合適的算法和數據結構。

並行算法:Google的核心優點

  上面的樣例在Google裏就要算是小case了!

天天Google的站點要處理十億個以上的搜索。GMail要儲存幾千萬用戶的2G郵箱, Google?

Earth要讓數十萬用戶同一時候在整個地球上遨遊。並將合適的圖片通過互聯網提交給每個用戶。假設沒有好的算法。這些應用都沒法成爲現實。

  在這些的應用中。哪怕是最主要的問題都會給傳統的計算帶來很是大的挑戰。好比,天天都有十億以上的用戶訪問Google的站點。使用Google 的服務,也產生很是多很是多的日誌(Log)。

因爲Log每份每秒都在飛速添加,咱們必須有聰明的辦法來進行處理。我之前在面試中問過關於怎樣對Log進行一 些分析處理的問題,有很是多面試者的回答儘管在邏輯上正確。但是實際應用中是差點兒不可行的。依照它們的算法。即使用上幾萬臺機器。咱們的處理速度都根不上數 據產生的速度。

那麼Google是怎樣解決這些問題的?

  首先,在網絡時代,就算有最好的算法,也要能在並行計算的環境下執行。在Google的數據中心。咱們使用的是超大的並行計算機。但傳統的並行 算法執行時,效率會在添加機器數量後迅速減小,也就是說,十臺機器假設有五倍的效果。添加到一千臺時或許就僅僅有幾十倍的效果。這樣的事半功倍的代價是沒有哪 家公司可以負擔得起的。而且,在不少並行算法中,僅僅要一個結點犯錯誤,所有計算都會前功盡棄。

  那麼Google是怎樣開發出既有效率又能容錯的並行計算的呢?

  Google最資深的計算機科學家Jeff?Dean認識到。Google所需的絕大部分數據處理都可以歸結爲一個簡單的並行算法:Map?

and?Reduce(http://labs.google.com/papers/mapreduce.html )。 這個算法能夠在很是多種計算中達到至關高的效率,而且是可擴展的(也就是說,一千臺機器就算不能達到一千倍的效果,至少也能夠達到幾百倍的效果)。 Map?and?

Reduce的另一大特點是它能夠利用大批便宜的機器組成功能強大的server?

farm。最後,它的容錯性能異常出色。就算一個 server?farm宕掉一半,整個fram依舊能夠執行。

正是因爲這個天才的認識。纔有了Map?and?

Reduce算法。藉助該算法。 Google差點兒能無限地添加計算量。與突飛猛進的互聯網應用一同成長。

算法並不侷限於計算機和網絡

  舉一個計算機領域外的樣例:在高能物理研究方面,很是多實驗每秒鐘都能幾個TB的數據量。

但因爲處理能力和存儲能力的不足。科學家不得不把絕大部 分未經處理的數據丟棄掉。可你們要知道,新元素的信息很是有可能就藏在咱們來不及處理的數據裏面。相同的,在其它不論什麼領域裏。算法可以改變人類的生活。好比 人類基因的研究。就可能因爲算法而發明新的醫療方式。在國家安全領域。有效的算法可能避免下一個911的發生。

在氣象方面,算法可以更好地預測將來天災的 發生,以解救生命。

  因此,假設你把計算機的發展放到應用和數據飛速增加的大環境。你會找到。該算法的重要性不是在日益減小,但在日益增強。

相關文章
相關標籤/搜索