演算法是電腦科學領域最重要的基石之一,但卻受到了國內一些程式設計師的冷落。許多學生看到一些公司在招聘時要求的程式語言五花八門就產生了一種誤解,認為學計算機就是學各種程式語言,或者認為,學習最新的語言、技術、標準就是最好的鋪路方法。其實大家都被這些公司誤導了。程式語言雖然該學,但是學習計算機演算法和理論更重要,因為計算機演算法和理論更重要,因為計算機語言和開發平台日新月異,但萬變不離其宗的是那些演算法和理論,例如資料結構、演算法、編譯原理、計算機體系結構、關係型資料庫原理等等。在「開復學生網」上,有位同學生動地把這些基礎課程比擬為「內功」,把新的語言、技術、標準比擬為「外功」。整天趕時髦的人最後只懂得招式,沒有功力,是不可能成為高手的。
演算法與我
網路時代的演算法
並行演算法: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/*****s/mapreduce.html。這個演算法能夠在很多種計算中達到相當高的效率,
而且是可擴充套件的(也就是說,一千臺機器就算不能達到一千倍的效果,至少也可以達到幾百倍的效果)。
map and reduce的另外一大特色是它可以利用大批廉價的機器組成功能強大的server farm。最後,它的容錯性能異常出色,就算乙個server farm宕掉一半,整個fram依然能夠執行。正是因為這個天才的認識,才有了map and reduce演算法。借助該演算法,google幾乎能無限地增加計算量,與日新月異的網際網路應用一同成長。
演算法並不侷限於計算機和網路
舉乙個計算機領域外的例子:在高能物理研究方面,很多實驗每秒鐘都能幾個tb的資料量。但因為處理能力和儲存能力的不足,科學家不得不把絕大部分未經處理的資料丟棄掉。可大家要知道,新元素的資訊很有可能就藏在我們來不及處理的資料裡面。同樣的,在其他任何領域裡,演算法可以改變人類的生活。例如人類基因的研究,就可能因為演算法而發明新的醫療方式。在****領域,有效的演算法可能避免下乙個911的發生。在氣象方面,演算法可以更好地**未來天災的發生,以拯救生命。所以,如果你把計算機的發展放到應用和資料飛速增長的大環境下,你一定會發現;演算法的重要性不是在日益減小,而是在日益加強。
李開復 演算法的力量
並行演算法 google的核心優勢 上面的例子在google裡就要算是小case了!每天google的 要處理十億個以上的搜尋,gmail要儲存幾千萬使用者的2g郵箱,google earth要讓數十萬使用者同時在整個地球上遨遊,並將合適的經過網際網路提交給每個使用者。如果沒有好的演算法,這些應用都...
演算法的力量 李開復
通過這個小例子,我們看到,應用程式的要求千變萬化,很多時候需要把乙個複雜的問題分解成若干簡單的小問題,然後再選用合適的演算法和資料結構。並行演算法 google的核心優勢 上面的例子在google裡就要算是小case了!每天google的 要處理十億個以上的搜尋,gmail要儲存幾千萬使用者的2g郵...
演算法的力量 李開復
程式語言雖然該學,但是學習計算機演算法和理論更重要,因為計算機演算法和理論更重要,因為計算機語言和開發平台日新月異,但萬變不離其宗的是那些演算法和理論,例如資料結構 演算法 編譯原理 計算機體系結構 關係型資料庫原理等等 演算法是電腦科學領域最重要的基石之一,但卻受到了國內一些程式設計師的冷落。許多...