《來自聖經的證明》收集了數十個簡潔而優雅的數學證明,迅速贏得了大批數學愛好者的追捧。如果還有一本《來自聖經的演算法》,哪些演算法會列入其中呢?最近,有人在 StackExchange 上發起了提問,向網友們徵集那些來自聖經的演算法。眾人在一大堆入圍演算法中進行投票,最終得出了呼聲最高的五個演算法:
第五名: BFPRT 演算法
1973 年, Blum 、 Floyd 、 Pratt 、 Rivest 、 Tarjan 集體出動,合寫了一篇題為 “Time bounds for selection” 的論文,給出了一種在數組中選出第 k 大元素的演算法,俗稱"中位元之中位元演算法"。依靠一種精心設計的 pivot 選取方法,該演算法從理論上保證了最壞情形下的線性時間複雜度,打敗了平均線性、最壞 O(n^2) 複雜度的傳統演算法。一群大牛把遞迴演算法的複雜度分析玩弄於骨掌股掌之間,構造出了一個當之無愧的來自聖經的演算法。
第四名:快速排序
快速排序演算法是 1960 年由英國電腦科學家 C.A.R. Hoare 發明的,是一種既高效又簡潔的排序方法,現在已是學習演算法的必修內容之一。快速排序的思想並不複雜,妙就妙在那個線性資料分割過程,而真正最牛 B 的則是對整個演算法的時間複雜度分析。我曾寫過一個快速排序平均 O(n log n) 的證明,分析過程絕對值得欣賞。
第三名:並查集
嚴格地說,並查集是一種資料結構,它專門用來處理集合的合併作業和查詢操作。並查集巧妙地借用了樹結構,使得編程複雜度降低到了令人難以置信的地步;用上一些遞迴技巧後,各種操作幾乎都能用兩行代碼搞定。而路徑壓縮的好主意,更是整個資料結構的畫龍點睛之筆。並查集的效率極高,單次操作的時間複雜度幾乎可以看作是常數層級;但由於資料結構的實際行為難以預測,精確的時間複雜度分析需要用到不少高深的技巧。
第二名: KMP 演算法
KMP 演算法是一種非常有效字串匹配演算法,它告訴了人們一個有些反直覺的事實:字串匹配竟然能線上性時間裡完成!整個演算法寫成代碼不足 10 行,但其中蘊含的天才般的奇妙思想讓演算法初學者們望而卻步,而它的複雜度分析則更是堪稱經典。
第一名:輾轉相除法
輾轉相除法是 Euclid 的《幾何原本》中提到的一種尋找兩個數的最大公因數的演算法。無論是簡潔的演算法過程,還是深刻的演算法原理,抑或是巧妙的複雜度分析,都稱得上是來自聖經的演算法。而擴充的輾轉相除法則構造性地證明了,對任意整數 a 和 b ,存在一對 x 、 y 使得 ax + by = gcd(a, b) 。這一結論的普遍性和實用性讓它成為了數論中的基本定理之一,在很多數學問題中都能看到它的身影。