總結(jié)顛覆人類社會的10個(gè)算法——重塑世界的偉大構(gòu)思
算法,作為解決問題的精確描述,是描述策略機(jī)制的系統(tǒng)方法。讓我們在周末輕松探討五個(gè)具有深遠(yuǎn)影響的算法:Metropolis-Hastings算法、單純形法、快速傅立葉變換、快速排序算法,以及計(jì)算特征值的QR算法。這些算法在統(tǒng)計(jì)物理、優(yōu)化、信號處理、排序甚至人工智能領(lǐng)域中扮演著關(guān)鍵角色。
1987年,通用電氣的兩位程序員(William E Lorensen 和 Harvey E. Cline)創(chuàng)造了行進(jìn)立方體算法(marching cubesalgorithm an algorithm)。這個(gè)算法使得醫(yī)生能夠通過CT和MRI掃描的數(shù)據(jù)進(jìn)行可視化處理,從而在醫(yī)學(xué)診斷中發(fā)揮了關(guān)鍵作用,挽救了無數(shù)生命。
每當(dāng)你通過編程指導(dǎo)機(jī)器解決問題時(shí),實(shí)際上是在創(chuàng)造算法。這些算法通過重新組織數(shù)據(jù)(如1和0)來執(zhí)行各種任務(wù),從簡單的如使動物發(fā)聲到復(fù)雜的如控制機(jī)器人行走。盡管許多算法可能不實(shí)用或效率低下,但也有一些算法既高效又具有美學(xué)價(jià)值,甚至有的因其獨(dú)特性而顯得神奇。文章接下來將介紹十種顛覆式的算法。
1.波函數(shù)塌縮(Wave function collapse)
波函數(shù)塌縮是科學(xué)中最奇怪的事情之一。在雙縫實(shí)驗(yàn)中,當(dāng)不對粒子進(jìn)行觀測時(shí),粒子表現(xiàn)出波動性質(zhì),形成干涉圖樣。然而,一旦進(jìn)行觀測,粒子的行為就會改變,顯示出典型的粒子特性,表現(xiàn)為單個(gè)點(diǎn)的撞擊。
這聽起來違反直覺,當(dāng)我們從“世界是模擬的”的角度去理解量子物理的神秘現(xiàn)象時(shí),例如在雙縫實(shí)驗(yàn)中粒子的波粒二象性,就好像宇宙本身是根據(jù)某種節(jié)省資源的算法運(yùn)行的。這種解釋仿佛宇宙在沒有被觀測時(shí)為了效率而采用波動模式,就像一個(gè)巨大的計(jì)算系統(tǒng)試圖節(jié)約其運(yùn)算資源一樣。這是一個(gè)值得哲學(xué)上思考的有趣概念,但波函數(shù)塌縮的一般思想也可以在程序上實(shí)現(xiàn)。
想象有一個(gè)視頻游戲的地圖,其中的地圖理論上可以無限延伸。對于這樣的游戲,制作一個(gè)無限大的地圖是不切實(shí)際的,因此需要一個(gè)算法來在游戲進(jìn)行中實(shí)時(shí)、程序性地生成地圖。這意味著地圖的每個(gè)部分只有在玩家接近時(shí)才會被創(chuàng)建。
在量子物理中,波函數(shù)描述了一個(gè)量子系統(tǒng)(如一個(gè)粒子)的所有可能狀態(tài)。這個(gè)系統(tǒng)在未被觀察時(shí)存在于所有可能狀態(tài)的“超級位置”。當(dāng)我們進(jìn)行觀測時(shí),波函數(shù)“塌縮”,系統(tǒng)選擇了一個(gè)特定的狀態(tài)(比如粒子出現(xiàn)在一個(gè)特定位置)。
在游戲地圖的情況下,可以將整個(gè)未生成的地圖視為處于一種“超級位置”狀態(tài),其中包含所有可能的地圖布局。當(dāng)玩家移動并觸發(fā)地圖生成時(shí),算法就像波函數(shù)塌縮一樣選擇并創(chuàng)建一個(gè)特定的地圖區(qū)塊。這個(gè)過程是隨機(jī)的,但又遵循一致的規(guī)則(比如確保道路連貫),從而提供既隨機(jī)又連貫的結(jié)果。
2.擴(kuò)散算法(Diffusion algorithm)
擴(kuò)散算法是由OpenAI最初開發(fā)的一種機(jī)器學(xué)習(xí)算法,它是像Dolly和Stable Diffusion這樣的圖像生成器背后的“魔法”。但擴(kuò)散的概念實(shí)際上來自熱力學(xué),在熱力學(xué)中,擴(kuò)散是一個(gè)自然過程,其中粒子從高濃度區(qū)域自然地移動到低濃度區(qū)域,直到濃度均勻分布。這種擴(kuò)散過程是朝著熵(無序度)增加的方向進(jìn)行的,因?yàn)榱W訌挠行虻募袪顟B(tài)分散到更無序的均勻分布。
在人工智能中,尤其是在圖像生成的擴(kuò)散算法中,這一過程被逆轉(zhuǎn)了。算法的起點(diǎn)是生成高熵的狀態(tài),即充滿隨機(jī)噪聲的圖像,這類似于粒子在空間中均勻且隨機(jī)分布的高熵狀態(tài)。接著,算法逐步減少這種無序度,去除噪聲,最終產(chǎn)生一個(gè)低熵、高度結(jié)構(gòu)化的圖像。這個(gè)過程就像是將熵減少,將粒子從隨機(jī)分布轉(zhuǎn)變?yōu)橛行虻募蟹植迹c熱力學(xué)中的擴(kuò)散過程相反。
在使用擴(kuò)散算法之前,首先需要訓(xùn)練一個(gè)機(jī)器學(xué)習(xí)模型。這個(gè)模型需要學(xué)會如何從噪聲中重構(gòu)出清晰、連貫的圖像。擴(kuò)散算法分為兩個(gè)階段。
首先,模型在前向階段學(xué)習(xí)如何向清晰圖像添加噪聲,直到圖像變得完全隨機(jī);隨后,在逆向階段,模型再逆轉(zhuǎn)這一過程,從噪聲圖像中重構(gòu)出清晰、連貫的圖像。經(jīng)過大量標(biāo)記圖像的訓(xùn)練后,這種算法能夠生成新的、獨(dú)特的圖像,適用于高計(jì)算強(qiáng)度的任務(wù),如音頻和視頻內(nèi)容生成。
3.模擬退火算法(Simulated Annealing)
編程和優(yōu)化問題中一個(gè)常見的挑戰(zhàn)是,對于很多問題,存在多個(gè)可能的解決方案,而找到最佳解決方案通常并不簡單。
這里提到的“退火”一詞源自冶金學(xué),是一種處理金屬的技術(shù)。這個(gè)過程涉及將金屬加熱到一定溫度,使其內(nèi)部結(jié)構(gòu)變得柔軟和可塑,然后緩慢冷卻。這樣做的目的是減少金屬內(nèi)部的應(yīng)力和缺陷,從而改善其性能,如增強(qiáng)韌性和減少硬度。在優(yōu)化算法中,特別是模擬退火算法中,這個(gè)退火過程被用作尋找問題最優(yōu)解的隱喻。算法開始時(shí),類似于冶金中的高溫退火階段,允許對解決方案空間進(jìn)行廣泛的隨機(jī)探索。這意味著算法不僅可以探索看起來有前景的解決方案,而且可以跳出局部最優(yōu)解,探索那些初看起來可能不是最佳的方案。
尋找最優(yōu)解就像是在一個(gè)充滿高峰和低谷的山脈中尋找最高點(diǎn)。簡單的局部搜索方法,如爬山算法,可能會陷入最近的局部最高點(diǎn)(局部最優(yōu)解),而無法達(dá)到真正的最高點(diǎn)(全局最優(yōu)解)。退火算法通過在初期允許一些“壞”的移動(即使是朝向更低的點(diǎn)),增加了逃離局部最優(yōu)并最終找到全局最優(yōu)的可能性。隨著時(shí)間的推移,算法逐漸減少這種探索性質(zhì),趨向于穩(wěn)定在最優(yōu)解上。
因?yàn)槌跏紩r(shí)有許多局部峰值,所以溫度開始很高,允許算法自由探索。隨著時(shí)間的推移,溫度降低了,這減少了接受更差解決方案的可能性。這里的權(quán)衡是探索與利用。
4.睡眠排序(sleep sort)
有史以來最巧妙的排序算法無疑是睡眠排序。絕大多數(shù)排序算法,如快速排序、歸并排序等,都使用了一些經(jīng)典的計(jì)算機(jī)科學(xué)策略,比如分治法。這些算法通過將數(shù)組分解成較小的子數(shù)組來遞歸地進(jìn)行排序,最終合并得到完整的有序數(shù)組。
然而,某位天才找到了一個(gè)更好的方法,但它有點(diǎn)不尋常。以下是Bash中的代碼樣子,它非常簡單。
它遍歷數(shù)組,然后對于每個(gè)元素,它打開一個(gè)新線程,睡眠時(shí)間與其元素值成比例,最后醒來后打印該元素。這是天才之舉,在這種排序方法中,每個(gè)數(shù)組元素被分配到一個(gè)獨(dú)立的線程,并根據(jù)其值進(jìn)行相應(yīng)時(shí)間長度的睡眠。睡眠時(shí)間結(jié)束后,元素被輸出。這個(gè)過程實(shí)際上是利用了操作系統(tǒng)的CPU調(diào)度器來“排序”這些元素,因?yàn)橹递^小的元素會先被喚醒和輸出。這種方法的獨(dú)特之處在于它完全依賴于操作系統(tǒng)的線程管理和調(diào)度機(jī)制來實(shí)現(xiàn)排序,而不是傳統(tǒng)的比較和交換操作。
雖然這種方法在理論上可行并且創(chuàng)意十足,但它在實(shí)踐中效率低下、不可靠,并且受到操作系統(tǒng)調(diào)度策略的極大影響。在實(shí)際編程應(yīng)用中,依賴CPU調(diào)度器進(jìn)行排序不僅效率低下,而且結(jié)果的準(zhǔn)確性無法保證,特別是在處理大數(shù)據(jù)集時(shí)。
5.量子BOGO排序
另一個(gè)奇怪的排序算法是量子BOGO排序,它嘗試通過反復(fù)隨機(jī)猜測來排序數(shù)組,就像玩彩票一樣。但如果我們將相同的算法與量子力學(xué)應(yīng)用到多元宇宙,那么每一種可能的結(jié)果,比如一個(gè)數(shù)組的所有潛在排序方式,都已經(jīng)在某個(gè)平行宇宙中實(shí)現(xiàn)。在這種情況下,一個(gè)開發(fā)者面對一個(gè)未排序的數(shù)組,理論上在某個(gè)平行宇宙中已經(jīng)存在一個(gè)排好序的版本。雖然我們的技術(shù)還無法實(shí)現(xiàn)跨宇宙觀察或旅行,但如果能做到這一點(diǎn),我們或許能夠簡單地觀察到其他宇宙中的已排序數(shù)組,并通過一種假想的傳送技術(shù)前往那個(gè)宇宙,從而獲得排序后的數(shù)組。這個(gè)思路雖然純屬幻想,但在理論上提供了一個(gè)有趣的解決大型數(shù)組排序問題的可能途徑。
6.shor算法
有史以來最實(shí)用和優(yōu)秀的算法之一是RSA算法(Rivest-Shamir-Adleman)。RSA算法是公鑰密碼系統(tǒng)中最著名和廣泛使用的算法之一。它在數(shù)字安全領(lǐng)域發(fā)揮著關(guān)鍵作用,特別是在互聯(lián)網(wǎng)通信中。RSA允許人們在互聯(lián)網(wǎng)上加密數(shù)據(jù)(如電子郵件),并用數(shù)字簽名來驗(yàn)證身份和信息的完整性。
RSA算法的安全性基于一個(gè)數(shù)學(xué)上的事實(shí):將兩個(gè)大質(zhì)數(shù)相乘相對容易,但反過來,要從它們的乘積中找出這兩個(gè)原始的質(zhì)數(shù)卻極其困難和耗時(shí)。這種單向函數(shù)的特性使得RSA成為一個(gè)強(qiáng)大的加密工具。
盡管目前的計(jì)算機(jī)需要非常長的時(shí)間(例如300萬億年)來破解RSA加密,但量子計(jì)算的發(fā)展可能改變這一局面。量子計(jì)算機(jī)可以運(yùn)行Shor算法(Peter Shor在1994年提出的一種量子算法)。Shor算法利用了量子計(jì)算的獨(dú)特特性來執(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)步,未來可能需要新的加密方法來替代或增強(qiáng)RSA,以保持網(wǎng)絡(luò)通信的安全。這意味著網(wǎng)絡(luò)安全領(lǐng)域可能會經(jīng)歷重大變革,尤其是在量子計(jì)算機(jī)變得更加強(qiáng)大和實(shí)用時(shí)。
7.行進(jìn)立方體算法(Marching Cubes)
文章開頭,我提到了行進(jìn)立方體算法。算法從一個(gè)三維標(biāo)量場開始,這里的“標(biāo)量場”指的是一個(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))被用來確定立方體如何與所需的等值面相交。這些值被看作是一個(gè)8位整數(shù)中的位(0或1),代表了這個(gè)點(diǎn)是在等值面的內(nèi)部還是外部。
由于每個(gè)點(diǎn)可以是0或1,這樣一個(gè)立方體有2^8=256種不同的配置方式。每種配置對應(yīng)于一個(gè)特定的多邊形(或多邊形組合),這些多邊形用于表示通過該立方體的等值面的部分。算法沿著整個(gè)標(biāo)量場移動,對每個(gè)立方體重復(fù)這個(gè)過程,從而創(chuàng)建出一系列多邊形。這些多邊形拼接在一起,形成了一個(gè)完整的三維網(wǎng)格,代表了整個(gè)標(biāo)量場中的等值面。
在醫(yī)學(xué)成像(特別是MRI)中,這個(gè)過程特別有價(jià)值,因?yàn)樗试S從二維數(shù)據(jù)切片中重建出精確的三維模型,為醫(yī)生提供了更詳細(xì)的視圖來進(jìn)行診斷和治療規(guī)劃。
8.拜占庭容錯機(jī)制(Byzantine Fault Tolerance)
然而,在現(xiàn)代,我們常常處理的是云中的分布式系統(tǒng),這就引出了拜占庭將軍問題(Byzantine Generals Problem)。想象一下,你是拜占庭軍隊(duì)中的一名將軍,你和其他幾位將軍一起在一個(gè)城市周圍扎營,計(jì)劃在第二天早上發(fā)動攻擊。但如果其中一個(gè)將軍喝醉了,整個(gè)系統(tǒng)可能會崩潰。計(jì)算機(jī)有同樣的問題,有時(shí)它們可能會失敗或被黑客入侵,你永遠(yuǎn)不知道何時(shí)何地會發(fā)生。
幸運(yùn)的是,像PBFT(Practical Byzantine Fault Tolerance,實(shí)用拜占庭容錯)這樣的算法被設(shè)計(jì)出來解決這個(gè)問題,它們可以保證分布式網(wǎng)絡(luò)即使高達(dá)三分之一的節(jié)點(diǎn)出問題也能正常工作。
它的工作原理是,一個(gè)節(jié)點(diǎn)向其他節(jié)點(diǎn)廣播一個(gè)準(zhǔn)備消息,表明它已準(zhǔn)備好執(zhí)行將改變系統(tǒng)的代碼。其他節(jié)點(diǎn)回應(yīng)同意,然后在達(dá)到一定閾值后形成共識。一旦達(dá)成共識,原始節(jié)點(diǎn)向所有其他節(jié)點(diǎn)發(fā)送提交消息,然后它們就可以執(zhí)行更改,使整個(gè)系統(tǒng)的狀態(tài)保持一致。這樣的算法對區(qū)塊鏈技術(shù)和分布式云數(shù)據(jù)庫等至關(guān)重要。
9.Boids算法
然而,算法真正厲害的地方在于,它們還可以反映自然界,就像Boyd的人工生命程序。它創(chuàng)造于1986年,模擬了鳥類的群體行為。
Boids算法之所以引人注目,是因?yàn)樗軌驈膸讞l簡單的行為規(guī)則出發(fā),自然地產(chǎn)生出復(fù)雜且有組織的群體動態(tài)。
在Boids模型中,每個(gè)“boid”(代表一個(gè)個(gè)體,如一只鳥)遵循以下三條基本規(guī)則:
分離:為了避免擁擠,每個(gè)個(gè)體會避免與附近的其他個(gè)體太接近。這有助于防止碰撞和過度擁擠。
對齊:每個(gè)個(gè)體傾向于與周圍個(gè)體的平均方向和速度保持一致。這有助于群體保持同一方向上的協(xié)調(diào)運(yùn)動。
聚合:個(gè)體會向其附近群體的平均位置移動,以保持群體的凝聚性。
這些規(guī)則雖然簡單,但當(dāng)應(yīng)用于群體的每個(gè)個(gè)體時(shí),會產(chǎn)生出意想不到的復(fù)雜行為模式。這些行為模式包括有序的群體形態(tài)、群體的規(guī)避障礙行為等,這些復(fù)雜的圖案并不是直接通過編程指定的,而是從個(gè)體遵循簡單規(guī)則的集體行為中自然形成的。因此,Boids算法展示了從簡單規(guī)則到復(fù)雜系統(tǒng)行為的演化,這在計(jì)算機(jī)模擬和人工生命研究中是一個(gè)非常重要的成就。
10.Boyer-Moore算法
最后,讓我們看一個(gè)古老算法——Boyer-Moore字符串搜索算法。Boyer-Moore算法的一個(gè)令人驚訝的特性是,它在處理較大的文本時(shí),效率反而更高。這看似違反直覺,因?yàn)橥ǔN覀儠谕麛?shù)據(jù)量越大,搜索所需的時(shí)間越長。
Boyer-Moore算法之所以高效,是因?yàn)樗捎昧艘环N從右到左掃描文本的方法。這與大多數(shù)字符串搜索算法從左到右的掃描方式不同。
算法的兩條規(guī)則:
壞字符規(guī)則:當(dāng)算法在文本中遇到不在搜索模式中的字符時(shí)(稱為“壞字符”),它會使用一個(gè)預(yù)處理表來決定可以安全跳過多少字符。這可以顯著減少比較的次數(shù)。
好后綴規(guī)則:當(dāng)算法找到部分匹配但隨后出現(xiàn)不匹配時(shí),它會利用另一個(gè)預(yù)先計(jì)算的表來決定跳過的字符數(shù),這也有助于減少不必要的比較。
Boyer-Moore算法使用的這些規(guī)則被稱為啟發(fā)式方法。它們不保證在每個(gè)場景中都是最優(yōu)的,但通常比逐個(gè)字符比較的方法更有效。隨著文本長度的增加,Boyer-Moore算法通??梢蕴^更多的字符,因此搜索速度更快。這使得它在實(shí)際應(yīng)用中(如UNIX系統(tǒng)中的grep命令)非常高效。