當(dāng)今世界,已經(jīng)被發(fā)現(xiàn)或創(chuàng)造的算法不計(jì)其數(shù)。那么,你認(rèn)為哪些算法是迄今為止較經(jīng)典的呢?如果,一定要投票選出你最重視的十大算法,你會(huì)作何選擇呢?
    最近,有人在StackExchange上發(fā)起了提問,向網(wǎng)友們征集當(dāng)今世界最為經(jīng)典的十大算法。眾人在一大堆入圍算法中進(jìn)行投票,最終得出了呼聲最高的以下十個(gè)算法。

第十名:Huffman coding(霍夫曼編碼)
    霍夫曼編碼(Huffman Coding)是一種編碼方式,是一種用于無損數(shù)據(jù)壓縮的熵編碼(權(quán)編碼)算法。1952年,David A. Huffman在麻省理工攻讀博士時(shí)所發(fā)明的,并發(fā)表于《一種構(gòu)建極小多余編碼的方法》(A Method for the Construction of Minimum-Redundancy Codes)一文。


第九名:Binary Search (二分查找)
    在一個(gè)有序的集合中查找元素,可以使用二分查找算法,也叫二分搜索。二分查找算法先比較位于集合中間位置的元素與鍵的大小,有三種情況(假設(shè)集合是從小到大排列的):
    1.鍵小于中間位置的元素,則匹配元素必在左邊(如果有的話),于是對(duì)左邊的區(qū)域應(yīng)用二分搜索。
    2.鍵等于中間位置的元素,所以元素找到。
    3.鍵大于中間位置的元素,則匹配元素必在右邊(如果有的話),于是對(duì)右邊的區(qū)域應(yīng)用二分搜索。
另外,當(dāng)集合為空,則代表找不到。


第八名:Miller-Rabin作的類似的試驗(yàn)測(cè)試
    這個(gè)想法是利用素?cái)?shù)的性質(zhì)(如使用費(fèi)馬大定理)的小概率尋找見證不數(shù)素?cái)?shù)。如果沒有證據(jù)是足夠的隨機(jī)檢驗(yàn)后發(fā)現(xiàn),這一數(shù)字為素?cái)?shù)。


第七名:Depth First Search、Breadth First Search(深度、廣度優(yōu)先搜索)
    它們是許多其他算法的基礎(chǔ)。關(guān)于深度、廣度優(yōu)先搜索算法的具體介紹,請(qǐng)參考此文:教你通透徹底理解:BFS和DFS優(yōu)先搜索算法。


第六名:Gentry's Fully Homomorphic Encryption Scheme(紳士完全同態(tài)加密機(jī)制)算法。
    此算法很漂亮,它允許第三方執(zhí)行任意加密數(shù)據(jù)運(yùn)算得不到私鑰(不是很了解)。


第五名:Floyd-Warshall all-pairs最短路徑算法
    關(guān)于此算法的介紹,可參考我寫的此文:幾個(gè)最短路徑算法比較(http://blog.csdn.net/v_JULY_v/archive/2011/02/12/6181485.aspx)。
d[]: 二維數(shù)組. d[i,j]最小花費(fèi)、或最短路徑的鄰邊。

for k from 1 to n:
  for i from 1 to n:
    for j from 1 to n:
      d[i,j] = min(d[i,j], d[i,k] + d[k,j])

 

第四名:Quicksort(快速排序)
    快速排序算法幾乎涵蓋了所有經(jīng)典算法的所有榜單。它曾獲選二十世紀(jì)最偉大的十大算法(參考這:細(xì)數(shù)二十世紀(jì)最偉大的10大算法)。關(guān)于快速排序算法的具體介紹,請(qǐng)參考我寫的這篇文章:一之續(xù)、快速排序算法的深入分析。


第三名:BFPRT 算法
    1973 年,Blum、Floyd、Pratt、Rivest、Tarjan集體出動(dòng),合寫了一篇題為 “Time bounds for selection” 的論文,給出了一種在數(shù)組中選出第 k 大元素的算法,俗稱"中位數(shù)之中位數(shù)算法"。依靠一種精心設(shè)計(jì)的 pivot 選取方法,該算法從理論上保證了最壞情形下的線性時(shí)間復(fù)雜度,打敗了平均線性、最壞 O(n^2) 復(fù)雜度的傳統(tǒng)算法。一群大牛把遞歸算法的復(fù)雜度分析玩弄于骨掌股掌之間,構(gòu)造出了一個(gè)當(dāng)之無愧的來自圣經(jīng)的算法。

    我在這里簡(jiǎn)單介紹下在數(shù)組中選出第k大元素的時(shí)間復(fù)雜度為O(N)的算法:
    類似快排中的分割算法:

每次分割后都能返回樞紐點(diǎn)在數(shù)組中的位置s,然后比較s與k的大小
若大的話,則再次遞歸劃分array[s..n],
小的話,就遞歸array[left...s-1] //s為中間樞紐點(diǎn)元素。
否則返回array[s],就是partition中返回的值。 //就是要找到這個(gè)s。

找到符合要求的s值后,再遍歷輸出比s小的那一邊的元素。

  
第二名:Knuth-Morris-Pratt字符串匹配算法
    關(guān)于此算法的介紹,請(qǐng)參考此文:六、教你從頭到尾徹底理解KMP算法。KMP算法曾經(jīng)落選于二十世紀(jì)最偉大的十大算法,但人們顯然不能接受,如此漂亮、高效的KMP算法竟然會(huì)落選。所以,此次