演算法是內功,程式設計師別冷落演算法

2021-08-19 12:46:56 字數 1858 閱讀 6873

演算法的力量

演算法是電腦科學領域最重要的基石之一,但卻受到了國內一些程式設計師的冷落。許多學生看到一些公司在招聘時要求的程式語言五花八門就產生了一種誤解,認為學計算機就是學各種程式語言,或者認為,學習最新的語言、技術、標準就是最好的鋪路方法。其實大家都被這些公司誤導了。程式語言雖然該學,但是學習計算機演算法和理論更重要,因為計算機演算法和理論更重要,因為計算機語言和開發平台日新月異,但萬變不離其宗的是那些演算法和理論,例如資料結構、演算法、編譯原理、計算機體系結構、關係型資料庫原理等等。在「開復學生網」上,有位同學生動地把這些基礎課程比擬為「內功」,把新的語言、技術、標準比擬為「外功」。整天趕時髦的人最後只懂得招式,沒有功力,是不可能成為高手的。

演算法與我

當我在2023年轉入電腦科學系時,還沒有多少人的專業方向是電腦科學。有許多其他系的人嘲笑我們說:「知道為什麼只有你們系要加乙個『科學』,而沒有『物理科學系』或『化學科學系』嗎?因為人家是真的科學,不需要畫蛇添足,而你們自己心虛,生怕不『科學』,才這樣欲蓋彌彰。」其實,這點他們徹底弄錯了。真正學懂計算機的人(不只是「程式設計匠」)都對數學有相當的造詣,既能用科學家的嚴謹思維來求證,也能用工程師的務實手段來解決問題——而這種思維和手段的最佳演繹就是「演算法」。

並行演算法:google的核心優勢

上面的例子在google裡就要算是小case了!每天google的**要處理十億個以上的搜尋,gmail要儲存幾千萬使用者的2g郵箱, google earth要讓數十萬使用者同時在整個地球上遨遊,並將合適的經過網際網路提交給每個使用者。如果沒有好的演算法,這些應用都無法成為現實。

在這些的應用中,哪怕是最基本的問題都會給傳統的計算帶來很大的挑戰。例如,每天都有十億以上的使用者訪問google的**,使用google的服務,也產生很多很多的日誌(log)。因為log每份每秒都在飛速增加,我們必須有聰明的辦法來進行處理。我曾經在面試中問過關於如何對log進行一些分析處理的問題,有很多面試者的回答雖然在邏輯上正確,但是實際應用中是幾乎不可行的。按照它們的演算法,即便用上幾萬臺機器,我們的處理速度都根不上資料產生的速度。

那麼google是如何解決這些問題的?

首先,在網路時代,就算有最好的演算法,也要能在平行計算的環境下執行。在google的資料中心,我們使用的是超大的並行計算機。但傳統的並行演算法執行時,效率會在增加機器數量後迅速降低,也就是說,十臺機器如果有五倍的效果,增加到一千台時也許就只有幾十倍的效果。這種事倍功半的代價是沒有哪家公司可以負擔得起的。而且,在許多並行演算法中,只要乙個結點犯錯誤,所有計算都會前功盡棄。

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

google最資深的計算機科學家jeff dean認識到,google所需的絕大部分資料處理都可以歸結為乙個簡單的並行演算法:mapreduce。這個演算法能夠在很多種計算中達到相當高的效率,而且是可擴充套件的(也就是說,一千臺機器就算不能達到一千倍的效果,至少也可以達到幾百倍的效果)。 mapreduce的另外一大特色是它可以利用大批廉價的機器組成功能強大的server farm。最後,它的容錯性能異常出色,就算乙個 server farm宕掉一半,整個fram依然能夠執行。正是因為這個天才的認識,才有了mapreduce演算法。借助該演算法, google幾乎能無限地增加計算量,與日新月異的網際網路應用一同成長。

演算法並不侷限於計算機和網路 舉乙個計算機領域外的例子:在高能物理研究方面,很多實驗每秒鐘都能幾個tb的資料量。但因為處理能力和儲存能力的不足,科學家不得不把絕大部分未經處理的資料丟棄掉。可大家要知道,新元素的資訊很有可能就藏在我們來不及處理的資料裡面。同樣的,在其他任何領域裡,演算法可以改變人類的生活。例如人類基因的研究,就可能因為演算法而發明新的醫療方式。在****領域,有效的演算法可能避免下乙個911的發生。在氣象方面,演算法可以更好地**未來天災的發生,以拯救生命。 所以,如果你把計算機的發展放到應用和資料飛速增長的大環境下,你一定會發現;演算法的重要性不是在日益減小,而是在日益加強。

程式設計師內功修煉序列

程式設計師內功修煉序列 來自 panqiaomu 內功修煉比如演算法,資料結構,設計模式等,沒有了這些,做軟體開發只能浮於表面,是很難有質的突破的。有了深厚的內功,就像張無忌,看見別人剛打出的武功招式瞬間就學會了並且能反制敵人,這就或許就是tao吧。o o.此書架對2人裡的2人有用 對你有用 無用計...

程式設計師基礎演算法

1.a 搜尋演算法 圖形搜尋演算法,從給定起點到給定終點計算出路徑。其中使用了一種啟發式的估算,為每個節點估算通過該節點的最佳路徑,並以之為各個地點排定次序。演算法以得到的次序訪問這些節點。因此,a 搜尋演算法是最佳優先搜尋的範例。2.集束搜尋 又名定向搜尋,beam search 最佳優先搜尋演算...

Windows系統程式設計師的「內功」修煉

注 這篇blog是從一本書 竹林蹊徑 深入淺出windows驅動開發 的推薦序中摘錄出來的。我一直認為,編寫程式是一件很奇妙的事情,它可以帶來創造和控制的慾望。每當我閱讀或者編寫一段 時,腦子裡自然地就會想象這段 怎樣完成預定的邏輯。當面對乙個不熟悉的開發環境,或者乙個新的基礎平台時,首先要清楚這個...