不久前的某一天,我在瀏覽Reddit發現了一篇有趣的文章《統治世界的十大演算法》,作者George Dvorsky在那篇文章中試圖解釋演算法之於當今世界的重要性,以及哪些演算法對人類文明最為重要。
此時此刻,如果你已經學過演算法的話,那麼在你閱讀那篇文章時,你腦海中所浮現的第一件事也許是“作者是否明白演算法是什麼?”或是“Facebook的新聞提要是一種演算法?”,因為如果Facebook的新聞提要也算是一種演算法的話,那麼最終你可以把幾乎所有的東西都歸類為演算法。因此,在本文中我會試著去解釋什麼是演算法,以及哪十個(也許更多)演算法是真正統治世界的。
什麼是演算法?
直白地說,演算法就是任何明確定義的計算過程,它接收一些值或集合作為輸入,併產生一些值或集合作為輸出。這樣,演算法就是將輸入轉換為輸出的一系列計算過程。來源:Thomas H. Cormen, Chales E. Leiserson (2009), 《演算法導論第三版》。**
簡而言之,我們可以說演算法就是用來解決一個特定任務的一系列步驟(是的,不止計算機在使用演算法,人類也同樣如此)。目前,一個有效的演算法應該含有三個重要特性:
1. 它必須是有限的:如果你設計的演算法永無休止地嘗試解決問題,那麼它是無用的。
2. 它必須具備明確定義的指令:演算法的每一步都必須準確定義,在任何場景下指令都應當沒有歧義。
3. 它必須是有效的:一個演算法被設計用以解決某個問題,那麼它就應當能解決這個問題,並且僅僅使用紙和筆就能證明該演算法是收斂的。
還有一個要點需要指出,演算法不僅僅在電腦科學中使用,同時也存在於數學領域中。事實上,首個被記載的數學演算法要追溯到公元前1600年,古巴比倫人開發了已知最早的演算法,用作因式分解和計算平方根。這裡,我們回答了前面所提到的那篇文章中的第一個問題,它認為演算法是計算機範疇的實體,但如果你知曉演算法這個詞的真正內涵的話,真正統治世界的十大演算法也能在數學書籍中找到(加法、減法、乘積等等)。
不過在這篇文章中,讓我們將演算法的定義限定在計算機演算法上,所以剩下的問題是:哪十個演算法統治了世界?在此我整理了一個小型列表,排名不分先後。
1. 歸併排序,快速排序和堆排序
哪個排序演算法最好?這取決於你的需求,這也是為什麼我要將這三個使用頻率較高的排序演算法置於一處的原因。可能你比較偏愛其中一個,但它們都是同等重要的。
歸併排序演算法是目前為止我們擁有的最重要的演算法之一。它是一種基於比較的排序演算法,使用分治法解決那些原本複雜度為O(N^2)的問題。歸併排序是由數學家John von Neumann於1945年發明的。
快速排序是解決排序問題的另一種途徑,它使用就地分解演算法,同時它也是一種分治演算法。這個演算法的問題在於它是不穩定的排序演算法,但它在基於記憶體的陣列排序上確實非常高效。
最後,堆排序演算法使用一個優先佇列降低資料的查詢時間,它也是一種就地排序演算法,同樣也是不穩定的排序演算法。
相較於曾經使用的其他排序演算法(如氣泡排序),上述演算法帶來了顯著的改進。事實上,多虧了它們,今天我們才有了資料探勘、人工智慧、連結分析,以及世界上大部分的計算機工具,也包括網路在內。
(推薦閱讀:《視覺直觀感受 7 種常用的排序演算法》)
2. 傅立葉變換與快速傅立葉變換
整個數字世界都在使用這些簡單而又強大的演算法,將訊號從頻域轉換為時域,反之亦然。事實上,正是歸功於這些演算法,你才能看到這篇文章。
網際網路、你的WIFI、智慧手機、電話、計算機、路由器、衛星,幾乎所有內建計算機的東西都會以各種方式使用這些演算法實現各自的功能。如果你沒有學習這些重要的演算法,你將無法獲得電子、計算機或通訊方面的學位。
編注:關於傅立葉變換,可以看看韓昊寫的這篇文章《通俗講解傅立葉變換【完整版】》。
3. Dijkstra 演算法
毫無不誇張地說,如果沒有這個演算法,當今網際網路將無法有效工作。這是一種圖搜尋演算法,它被廣泛應用在能夠建模為圖的問題中,用以找出兩個節點之間的最短路徑。
目前,即便我們已經擁有了解決最短路徑問題的更好方法,Dijkstra 演算法依然在那些重視穩定性的系統中得到應用。
4. RSA演算法
如果沒有資訊加密和網路安全,網際網路不會像現在那麼重要。你可以認為“安全問題理所當然應該是美國國家安全域性和其他情報機構的事情”或“你認為你身處在網際網路是安全的,這太天真了”。但是,人們需要在他們花錢時保有安全感,畢竟你不會在網路伺服器上輸入你的信用卡號,如果你知道它是不安全的話。
在資訊加密領域,有一個演算法始終是世界上最重要的演算法之一,它就是RSA演算法。這個演算法是由RSA公司的創始人所建立的,它使資訊加密惠及千家萬戶,奠定了當今資訊加密的運作基礎。RSA演算法用來解決一個簡單而又複雜的問題:怎樣在不同平臺和終端使用者之間共享公鑰,繼而實現資訊加密(我想說明一下這個問題還沒完全解決,我想我們需要基於這個方向做更多工作)。
5. 安全雜湊演算法
準確地說,它不能稱之為是演算法,它是美國國家標準暨技術學會定義的加密雜湊函式族中的一員,但是這族演算法對整個世界的運作至關重要。從你的應用商店,你的郵件,你的防毒軟體,到你的瀏覽器等等,所有這些都在使用安全雜湊演算法,它能判斷你是否下載了你想要的東西,也能判斷你是否是中間人攻擊或網路釣魚攻擊的受害者。
(推薦閱讀:《加鹽密碼雜湊:如何正確使用》)
6. 整數因式分解
這是在計算機領域被大量使用的數學演算法,沒有這個演算法,資訊加密會更不安全。該演算法定義了一系列步驟,得到將一合數分解為更小因子的質數分解式。這被認為是一種FNP問題,它是NP分類問題的延伸,極其難以解決。
許多加密協議(如RSA演算法)都基於這樣一個原理:對大的合數作因式分解是非常困難的。如果一個演算法能夠快速地對任意整數進行因式分解,RSA的公鑰加密體系就會失去其安全性。
量子計算的誕生使我們能夠更容易地解決這類問題,同時它也開啟了一個全新的領域,使得我們能夠利用量子世界中的特性來保證系統安全。
7. 連結分析
在網際網路時代,分析不同實體間的關係是相當重要的。從搜尋引擎,社交網路,到營銷分析工具,每個人都在不停尋找網際網路的真正結構。
有證據顯示,連結分析是公眾心目中伴隨著最多謬見和誤解的演算法之一。這裡的問題在於,有很多不同的方式可以進行連結分析,也存在很多特性使這些演算法看起來有細微的區別(這些區別允許該演算法獨立申請專利),但它們本質上是類似的。
連結分析背後的理念非常簡單,以矩陣形式描繪出一張圖,將問題轉換為特徵值問題。特徵值是一種很好的渠道,它有助於展現圖的結構以及每個節點的相對重要性。該演算法是由Gabriel Pinski和Francis Narin於1976年建立的。
誰在使用這個演算法?Google的Page Rank演算法,Facebook向你展示的新聞提要(這就是為什麼Facebook的新聞提要不是演算法,只是使用演算法的結果而已),Google+和Facebook的好友推薦,LinkedIn的工作和聯絡人推薦,Netflix和Hulu的電影,YouTuBe的視訊,等等。雖然每個都有不同的目標和引數,但它們背後的數學理念是相同的。
最後,我想說明一點,儘管看上去Google是第一家使用這類演算法的公司,然而在1996年(Google之前兩年),Robin Li(李彥宏)所建立的一個小型搜尋引擎“RankDex”就已經在它的網頁排名機制中使用了這項理念。後來,HyperSearch的創始人Massimo Marchiori基於各網頁之間的關係使用了另一種網頁排名演算法。(Google在它的專利中提到了這兩位創始者)
(推薦閱讀:《張洋:淺析PageRank演算法)
8. 比例積分微分演算法
你是否曾經用過飛機、汽車、衛星服務或手機網路?你是否曾經在工廠工作或是看見過機器人?如果回答是肯定的,那麼你應該已經見識過這個演算法了。
大體上,這個演算法使用一種控制迴路反饋機制,將期望輸出訊號和實際輸出訊號之間的錯誤最小化。無論何處,只要你需要進行訊號處理,或者你需要一套電子系統,用來自動化控制機械、液壓或熱力系統,這個演算法都會有用武之地。
可以這樣說,如果沒有這個演算法,現代文明將不復存在。
9. 資料壓縮演算法
要判斷哪種資料壓縮演算法最為重要是很困難的,因為它取決於不同的應用環境。它們可以應用在zip和mp3上,也可以應用在JPEG和MPEG-2上。但眾所周知,在所有結構中這些演算法都極其重要。
除了顯而易見的zip檔案,在哪我們能夠找到這些演算法?這張網頁就進行了資料壓縮並被下載到你本地,同時我們還能在電子遊戲、視訊、音樂、資料儲存、雲端計算、資料庫等等地方找到這些演算法。可以說,資料壓縮演算法處處可見,它們使系統成本更低、效率更高。
10. 隨機數生成
現在我們還沒有一個“真正的”隨機數生成器,但我們已經有了一些偽隨機數生成器,這夠用了。隨機數生成器的用途非常廣泛,從互聯聯絡、資料加密、安全雜湊演算法、電子遊戲、人工智慧、優化分析,到問題的初始條件、金融等等,都有它們的身影。
(推薦閱讀:《當隨機不夠隨機:一個線上撲克遊戲的教訓》)
最後,我想強調一下,上面這個列表經供參考,它並不完整。因為在機器學習、矩陣乘法、分類化等領域也有一些演算法,它們對我們的世界同樣重要,但在這裡還沒有提到。