總結(jié)顛覆人類社會(huì)的10個(gè)算法——重塑世界的偉大構(gòu)思
算法,作為解決問(wèn)題的精確描述,是描述策略機(jī)制的系統(tǒng)方法。讓我們?cè)谥苣┹p松探討五個(gè)具有深遠(yuǎn)影響的算法:Metropolis-Hastings算法、單純形法、快速傅立葉變換、快速排序算法,以及計(jì)算特征值的QR算法。這些算法在統(tǒng)計(jì)物理、優(yōu)化、信號(hào)處理、排序甚至人工智能領(lǐng)域中扮演著關(guān)鍵角色。
1987年,通用電氣的兩位程序員(William E Lorensen 和 Harvey E. Cline)創(chuàng)造了行進(jìn)立方體算法(marching cubesalgorithm an algorithm)。這個(gè)算法使得醫(yī)生能夠通過(guò)CT和MRI掃描的數(shù)據(jù)進(jìn)行可視化處理,從而在醫(yī)學(xué)診斷中發(fā)揮了關(guān)鍵作用,挽救了無(wú)數(shù)生命。

每當(dāng)你通過(guò)編程指導(dǎo)機(jī)器解決問(wèn)題時(shí),實(shí)際上是在創(chuàng)造算法。這些算法通過(guò)重新組織數(shù)據(jù)(如1和0)來(lái)執(zhí)行各種任務(wù),從簡(jiǎn)單的如使動(dòng)物發(fā)聲到復(fù)雜的如控制機(jī)器人行走。盡管許多算法可能不實(shí)用或效率低下,但也有一些算法既高效又具有美學(xué)價(jià)值,甚至有的因其獨(dú)特性而顯得神奇。文章接下來(lái)將介紹十種顛覆式的算法。
1.波函數(shù)塌縮(Wave function collapse)
波函數(shù)塌縮是科學(xué)中最奇怪的事情之一。在雙縫實(shí)驗(yàn)中,當(dāng)不對(duì)粒子進(jìn)行觀測(cè)時(shí),粒子表現(xiàn)出波動(dòng)性質(zhì),形成干涉圖樣。然而,一旦進(jìn)行觀測(cè),粒子的行為就會(huì)改變,顯示出典型的粒子特性,表現(xiàn)為單個(gè)點(diǎn)的撞擊。

這聽(tīng)起來(lái)違反直覺(jué),當(dāng)我們從“世界是模擬的”的角度去理解量子物理的神秘現(xiàn)象時(shí),例如在雙縫實(shí)驗(yàn)中粒子的波粒二象性,就好像宇宙本身是根據(jù)某種節(jié)省資源的算法運(yùn)行的。這種解釋仿佛宇宙在沒(méi)有被觀測(cè)時(shí)為了效率而采用波動(dòng)模式,就像一個(gè)巨大的計(jì)算系統(tǒng)試圖節(jié)約其運(yùn)算資源一樣。這是一個(gè)值得哲學(xué)上思考的有趣概念,但波函數(shù)塌縮的一般思想也可以在程序上實(shí)現(xiàn)。

想象有一個(gè)視頻游戲的地圖,其中的地圖理論上可以無(wú)限延伸。對(duì)于這樣的游戲,制作一個(gè)無(wú)限大的地圖是不切實(shí)際的,因此需要一個(gè)算法來(lái)在游戲進(jìn)行中實(shí)時(shí)、程序性地生成地圖。這意味著地圖的每個(gè)部分只有在玩家接近時(shí)才會(huì)被創(chuàng)建。
在量子物理中,波函數(shù)描述了一個(gè)量子系統(tǒng)(如一個(gè)粒子)的所有可能狀態(tài)。這個(gè)系統(tǒng)在未被觀察時(shí)存在于所有可能狀態(tài)的“超級(jí)位置”。當(dāng)我們進(jìn)行觀測(cè)時(shí),波函數(shù)“塌縮”,系統(tǒng)選擇了一個(gè)特定的狀態(tài)(比如粒子出現(xiàn)在一個(gè)特定位置)。
在游戲地圖的情況下,可以將整個(gè)未生成的地圖視為處于一種“超級(jí)位置”狀態(tài),其中包含所有可能的地圖布局。當(dāng)玩家移動(dòng)并觸發(fā)地圖生成時(shí),算法就像波函數(shù)塌縮一樣選擇并創(chuàng)建一個(gè)特定的地圖區(qū)塊。這個(gè)過(guò)程是隨機(jī)的,但又遵循一致的規(guī)則(比如確保道路連貫),從而提供既隨機(jī)又連貫的結(jié)果。
2.擴(kuò)散算法(Diffusion algorithm)
擴(kuò)散算法是由OpenAI最初開(kāi)發(fā)的一種機(jī)器學(xué)習(xí)算法,它是像Dolly和Stable Diffusion這樣的圖像生成器背后的“魔法”。但擴(kuò)散的概念實(shí)際上來(lái)自熱力學(xué),在熱力學(xué)中,擴(kuò)散是一個(gè)自然過(guò)程,其中粒子從高濃度區(qū)域自然地移動(dòng)到低濃度區(qū)域,直到濃度均勻分布。這種擴(kuò)散過(guò)程是朝著熵(無(wú)序度)增加的方向進(jìn)行的,因?yàn)榱W訌挠行虻募袪顟B(tài)分散到更無(wú)序的均勻分布。

在人工智能中,尤其是在圖像生成的擴(kuò)散算法中,這一過(guò)程被逆轉(zhuǎn)了。算法的起點(diǎn)是生成高熵的狀態(tài),即充滿隨機(jī)噪聲的圖像,這類似于粒子在空間中均勻且隨機(jī)分布的高熵狀態(tài)。接著,算法逐步減少這種無(wú)序度,去除噪聲,最終產(chǎn)生一個(gè)低熵、高度結(jié)構(gòu)化的圖像。這個(gè)過(guò)程就像是將熵減少,將粒子從隨機(jī)分布轉(zhuǎn)變?yōu)橛行虻募蟹植迹c熱力學(xué)中的擴(kuò)散過(guò)程相反。

在使用擴(kuò)散算法之前,首先需要訓(xùn)練一個(gè)機(jī)器學(xué)習(xí)模型。這個(gè)模型需要學(xué)會(huì)如何從噪聲中重構(gòu)出清晰、連貫的圖像。擴(kuò)散算法分為兩個(gè)階段。
首先,模型在前向階段學(xué)習(xí)如何向清晰圖像添加噪聲,直到圖像變得完全隨機(jī);隨后,在逆向階段,模型再逆轉(zhuǎn)這一過(guò)程,從噪聲圖像中重構(gòu)出清晰、連貫的圖像。經(jīng)過(guò)大量標(biāo)記圖像的訓(xùn)練后,這種算法能夠生成新的、獨(dú)特的圖像,適用于高計(jì)算強(qiáng)度的任務(wù),如音頻和視頻內(nèi)容生成。
3.模擬退火算法(Simulated Annealing)
編程和優(yōu)化問(wèn)題中一個(gè)常見(jiàn)的挑戰(zhàn)是,對(duì)于很多問(wèn)題,存在多個(gè)可能的解決方案,而找到最佳解決方案通常并不簡(jiǎn)單。

這里提到的“退火”一詞源自冶金學(xué),是一種處理金屬的技術(shù)。這個(gè)過(guò)程涉及將金屬加熱到一定溫度,使其內(nèi)部結(jié)構(gòu)變得柔軟和可塑,然后緩慢冷卻。這樣做的目的是減少金屬內(nèi)部的應(yīng)力和缺陷,從而改善其性能,如增強(qiáng)韌性和減少硬度。在優(yōu)化算法中,特別是模擬退火算法中,這個(gè)退火過(guò)程被用作尋找問(wèn)題最優(yōu)解的隱喻。算法開(kāi)始時(shí),類似于冶金中的高溫退火階段,允許對(duì)解決方案空間進(jìn)行廣泛的隨機(jī)探索。這意味著算法不僅可以探索看起來(lái)有前景的解決方案,而且可以跳出局部最優(yōu)解,探索那些初看起來(lái)可能不是最佳的方案。
尋找最優(yōu)解就像是在一個(gè)充滿高峰和低谷的山脈中尋找最高點(diǎn)。簡(jiǎn)單的局部搜索方法,如爬山算法,可能會(huì)陷入最近的局部最高點(diǎn)(局部最優(yōu)解),而無(wú)法達(dá)到真正的最高點(diǎn)(全局最優(yōu)解)。退火算法通過(guò)在初期允許一些“壞”的移動(dòng)(即使是朝向更低的點(diǎn)),增加了逃離局部最優(yōu)并最終找到全局最優(yōu)的可能性。隨著時(shí)間的推移,算法逐漸減少這種探索性質(zhì),趨向于穩(wěn)定在最優(yōu)解上。
因?yàn)槌跏紩r(shí)有許多局部峰值,所以溫度開(kāi)始很高,允許算法自由探索。隨著時(shí)間的推移,溫度降低了,這減少了接受更差解決方案的可能性。這里的權(quán)衡是探索與利用。
4.睡眠排序(sleep sort)
有史以來(lái)最巧妙的排序算法無(wú)疑是睡眠排序。絕大多數(shù)排序算法,如快速排序、歸并排序等,都使用了一些經(jīng)典的計(jì)算機(jī)科學(xué)策略,比如分治法。這些算法通過(guò)將數(shù)組分解成較小的子數(shù)組來(lái)遞歸地進(jìn)行排序,最終合并得到完整的有序數(shù)組。
然而,某位天才找到了一個(gè)更好的方法,但它有點(diǎn)不尋常。以下是Bash中的代碼樣子,它非常簡(jiǎn)單。

它遍歷數(shù)組,然后對(duì)于每個(gè)元素,它打開(kāi)一個(gè)新線程,睡眠時(shí)間與其元素值成比例,最后醒來(lái)后打印該元素。這是天才之舉,在這種排序方法中,每個(gè)數(shù)組元素被分配到一個(gè)獨(dú)立的線程,并根據(jù)其值進(jìn)行相應(yīng)時(shí)間長(zhǎng)度的睡眠。睡眠時(shí)間結(jié)束后,元素被輸出。這個(gè)過(guò)程實(shí)際上是利用了操作系統(tǒng)的CPU調(diào)度器來(lái)“排序”這些元素,因?yàn)橹递^小的元素會(huì)先被喚醒和輸出。這種方法的獨(dú)特之處在于它完全依賴于操作系統(tǒng)的線程管理和調(diào)度機(jī)制來(lái)實(shí)現(xiàn)排序,而不是傳統(tǒng)的比較和交換操作。
雖然這種方法在理論上可行并且創(chuàng)意十足,但它在實(shí)踐中效率低下、不可靠,并且受到操作系統(tǒng)調(diào)度策略的極大影響。在實(shí)際編程應(yīng)用中,依賴CPU調(diào)度器進(jìn)行排序不僅效率低下,而且結(jié)果的準(zhǔn)確性無(wú)法保證,特別是在處理大數(shù)據(jù)集時(shí)。
5.量子BOGO排序

另一個(gè)奇怪的排序算法是量子BOGO排序,它嘗試通過(guò)反復(fù)隨機(jī)猜測(cè)來(lái)排序數(shù)組,就像玩彩票一樣。但如果我們將相同的算法與量子力學(xué)應(yīng)用到多元宇宙,那么每一種可能的結(jié)果,比如一個(gè)數(shù)組的所有潛在排序方式,都已經(jīng)在某個(gè)平行宇宙中實(shí)現(xiàn)。在這種情況下,一個(gè)開(kāi)發(fā)者面對(duì)一個(gè)未排序的數(shù)組,理論上在某個(gè)平行宇宙中已經(jīng)存在一個(gè)排好序的版本。雖然我們的技術(shù)還無(wú)法實(shí)現(xiàn)跨宇宙觀察或旅行,但如果能做到這一點(diǎn),我們或許能夠簡(jiǎn)單地觀察到其他宇宙中的已排序數(shù)組,并通過(guò)一種假想的傳送技術(shù)前往那個(gè)宇宙,從而獲得排序后的數(shù)組。這個(gè)思路雖然純屬幻想,但在理論上提供了一個(gè)有趣的解決大型數(shù)組排序問(wèn)題的可能途徑。
6.shor算法
有史以來(lái)最實(shí)用和優(yōu)秀的算法之一是RSA算法(Rivest-Shamir-Adleman)。RSA算法是公鑰密碼系統(tǒng)中最著名和廣泛使用的算法之一。它在數(shù)字安全領(lǐng)域發(fā)揮著關(guān)鍵作用,特別是在互聯(lián)網(wǎng)通信中。RSA允許人們?cè)诨ヂ?lián)網(wǎng)上加密數(shù)據(jù)(如電子郵件),并用數(shù)字簽名來(lái)驗(yàn)證身份和信息的完整性。

RSA算法的安全性基于一個(gè)數(shù)學(xué)上的事實(shí):將兩個(gè)大質(zhì)數(shù)相乘相對(duì)容易,但反過(guò)來(lái),要從它們的乘積中找出這兩個(gè)原始的質(zhì)數(shù)卻極其困難和耗時(shí)。這種單向函數(shù)的特性使得RSA成為一個(gè)強(qiáng)大的加密工具。
盡管目前的計(jì)算機(jī)需要非常長(zhǎng)的時(shí)間(例如300萬(wàn)億年)來(lái)破解RSA加密,但量子計(jì)算的發(fā)展可能改變這一局面。量子計(jì)算機(jī)可以運(yùn)行Shor算法(Peter Shor在1994年提出的一種量子算法)。Shor算法利用了量子計(jì)算的獨(dú)特特性來(lái)執(zhí)行質(zhì)因數(shù)分解。它依賴于量子位(qubits)、疊加態(tài)和量子糾纏等概念。量子位與經(jīng)典計(jì)算中的位不同,它可以同時(shí)表示0和1的疊加態(tài)。量子糾纏是量子位之間的一種特殊關(guān)聯(lián),使得量子計(jì)算能夠并行執(zhí)行大量的計(jì)算,遠(yuǎn)超傳統(tǒng)計(jì)算機(jī)。盡管Shor算法在理論上非常強(qiáng)大,但在實(shí)際應(yīng)用中還面臨著一些限制。到目前為止,使用量子計(jì)算機(jī)分解的最大數(shù)字是21。即使是像IBM的最先進(jìn)的Q系統(tǒng)這樣的量子計(jì)算機(jī),在嘗試分解稍大的數(shù)字(如35)時(shí)也未能成功。

隨著量子計(jì)算技術(shù)的進(jìn)步,未來(lái)可能需要新的加密方法來(lái)替代或增強(qiáng)RSA,以保持網(wǎng)絡(luò)通信的安全。這意味著網(wǎng)絡(luò)安全領(lǐng)域可能會(huì)經(jīng)歷重大變革,尤其是在量子計(jì)算機(jī)變得更加強(qiáng)大和實(shí)用時(shí)。
7.行進(jìn)立方體算法(Marching Cubes)
文章開(kāi)頭,我提到了行進(jìn)立方體算法。算法從一個(gè)三維標(biāo)量場(chǎng)開(kāi)始,這里的“標(biāo)量場(chǎng)”指的是一個(gè)三維空間,其中每個(gè)點(diǎn)都有一個(gè)數(shù)字值(標(biāo)量)。在醫(yī)學(xué)成像的上下文中,這些標(biāo)量值可以代表不同的組織密度或其他醫(yī)學(xué)相關(guān)的度量。
算法選取空間中的一個(gè)點(diǎn),并考慮該點(diǎn)及其周圍的八個(gè)相鄰點(diǎn),共同構(gòu)成一個(gè)立方體。這九個(gè)點(diǎn)的標(biāo)量值(實(shí)際上是立方體角上的八個(gè)點(diǎn))被用來(lái)確定立方體如何與所需的等值面相交。這些值被看作是一個(gè)8位整數(shù)中的位(0或1),代表了這個(gè)點(diǎn)是在等值面的內(nèi)部還是外部。

由于每個(gè)點(diǎn)可以是0或1,這樣一個(gè)立方體有2^8=256種不同的配置方式。每種配置對(duì)應(yīng)于一個(gè)特定的多邊形(或多邊形組合),這些多邊形用于表示通過(guò)該立方體的等值面的部分。算法沿著整個(gè)標(biāo)量場(chǎng)移動(dòng),對(duì)每個(gè)立方體重復(fù)這個(gè)過(guò)程,從而創(chuàng)建出一系列多邊形。這些多邊形拼接在一起,形成了一個(gè)完整的三維網(wǎng)格,代表了整個(gè)標(biāo)量場(chǎng)中的等值面。

在醫(yī)學(xué)成像(特別是MRI)中,這個(gè)過(guò)程特別有價(jià)值,因?yàn)樗试S從二維數(shù)據(jù)切片中重建出精確的三維模型,為醫(yī)生提供了更詳細(xì)的視圖來(lái)進(jìn)行診斷和治療規(guī)劃。
8.拜占庭容錯(cuò)機(jī)制(Byzantine Fault Tolerance)
然而,在現(xiàn)代,我們常常處理的是云中的分布式系統(tǒng),這就引出了拜占庭將軍問(wèn)題(Byzantine Generals Problem)。想象一下,你是拜占庭軍隊(duì)中的一名將軍,你和其他幾位將軍一起在一個(gè)城市周圍扎營(yíng),計(jì)劃在第二天早上發(fā)動(dòng)攻擊。但如果其中一個(gè)將軍喝醉了,整個(gè)系統(tǒng)可能會(huì)崩潰。計(jì)算機(jī)有同樣的問(wèn)題,有時(shí)它們可能會(huì)失敗或被黑客入侵,你永遠(yuǎn)不知道何時(shí)何地會(huì)發(fā)生。
幸運(yùn)的是,像PBFT(Practical Byzantine Fault Tolerance,實(shí)用拜占庭容錯(cuò))這樣的算法被設(shè)計(jì)出來(lái)解決這個(gè)問(wèn)題,它們可以保證分布式網(wǎng)絡(luò)即使高達(dá)三分之一的節(jié)點(diǎn)出問(wèn)題也能正常工作。

它的工作原理是,一個(gè)節(jié)點(diǎn)向其他節(jié)點(diǎn)廣播一個(gè)準(zhǔn)備消息,表明它已準(zhǔn)備好執(zhí)行將改變系統(tǒng)的代碼。其他節(jié)點(diǎn)回應(yīng)同意,然后在達(dá)到一定閾值后形成共識(shí)。一旦達(dá)成共識(shí),原始節(jié)點(diǎn)向所有其他節(jié)點(diǎn)發(fā)送提交消息,然后它們就可以執(zhí)行更改,使整個(gè)系統(tǒng)的狀態(tài)保持一致。這樣的算法對(duì)區(qū)塊鏈技術(shù)和分布式云數(shù)據(jù)庫(kù)等至關(guān)重要。
9.Boids算法
然而,算法真正厲害的地方在于,它們還可以反映自然界,就像Boyd的人工生命程序。它創(chuàng)造于1986年,模擬了鳥(niǎo)類的群體行為。

Boids算法之所以引人注目,是因?yàn)樗軌驈膸讞l簡(jiǎn)單的行為規(guī)則出發(fā),自然地產(chǎn)生出復(fù)雜且有組織的群體動(dòng)態(tài)。
在Boids模型中,每個(gè)“boid”(代表一個(gè)個(gè)體,如一只鳥(niǎo))遵循以下三條基本規(guī)則:
分離:為了避免擁擠,每個(gè)個(gè)體會(huì)避免與附近的其他個(gè)體太接近。這有助于防止碰撞和過(guò)度擁擠。
對(duì)齊:每個(gè)個(gè)體傾向于與周圍個(gè)體的平均方向和速度保持一致。這有助于群體保持同一方向上的協(xié)調(diào)運(yùn)動(dòng)。
聚合:個(gè)體會(huì)向其附近群體的平均位置移動(dòng),以保持群體的凝聚性。
這些規(guī)則雖然簡(jiǎn)單,但當(dāng)應(yīng)用于群體的每個(gè)個(gè)體時(shí),會(huì)產(chǎn)生出意想不到的復(fù)雜行為模式。這些行為模式包括有序的群體形態(tài)、群體的規(guī)避障礙行為等,這些復(fù)雜的圖案并不是直接通過(guò)編程指定的,而是從個(gè)體遵循簡(jiǎn)單規(guī)則的集體行為中自然形成的。因此,Boids算法展示了從簡(jiǎn)單規(guī)則到復(fù)雜系統(tǒng)行為的演化,這在計(jì)算機(jī)模擬和人工生命研究中是一個(gè)非常重要的成就。
10.Boyer-Moore算法
最后,讓我們看一個(gè)古老算法——Boyer-Moore字符串搜索算法。Boyer-Moore算法的一個(gè)令人驚訝的特性是,它在處理較大的文本時(shí),效率反而更高。這看似違反直覺(jué),因?yàn)橥ǔN覀儠?huì)期望數(shù)據(jù)量越大,搜索所需的時(shí)間越長(zhǎng)。

Boyer-Moore算法之所以高效,是因?yàn)樗捎昧艘环N從右到左掃描文本的方法。這與大多數(shù)字符串搜索算法從左到右的掃描方式不同。
算法的兩條規(guī)則:
壞字符規(guī)則:當(dāng)算法在文本中遇到不在搜索模式中的字符時(shí)(稱為“壞字符”),它會(huì)使用一個(gè)預(yù)處理表來(lái)決定可以安全跳過(guò)多少字符。這可以顯著減少比較的次數(shù)。
好后綴規(guī)則:當(dāng)算法找到部分匹配但隨后出現(xiàn)不匹配時(shí),它會(huì)利用另一個(gè)預(yù)先計(jì)算的表來(lái)決定跳過(guò)的字符數(shù),這也有助于減少不必要的比較。
Boyer-Moore算法使用的這些規(guī)則被稱為啟發(fā)式方法。它們不保證在每個(gè)場(chǎng)景中都是最優(yōu)的,但通常比逐個(gè)字符比較的方法更有效。隨著文本長(zhǎng)度的增加,Boyer-Moore算法通常可以跳過(guò)更多的字符,因此搜索速度更快。這使得它在實(shí)際應(yīng)用中(如UNIX系統(tǒng)中的grep命令)非常高效。