[轉載] 陳皓:一些重要的演算法
原文: http://coolshell.cn/?p=2583
PS:本文是轉載自陳皓大神的部落格,希望對你有所幫助!
下面是一些比較重要的演算法,原文羅列了32個,但我覺得有很多是數論裡的或是比較生僻的,和計算機的不相干,所以沒有選取。下面的這些,有的我們經常在用,有的基本不用。有的很常見,有的很偏。不過了解一下也是好事。也歡迎你留下你覺得有意義的演算法。(注:本篇文章並非翻譯,其中的演算法描述大部份摘自Wikipedia,因為維基百科描述的很專業了)
- A*搜尋演算法
俗稱A星演算法。這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的演算法。常用於遊戲中的NPC的移動計算,或線上遊戲的BOT的移動計算上。該演算法像Dijkstra演算法一樣,可以找到一條最短路徑;也像BFS一樣,進行啟發式的搜尋。 - Beam Search
束搜尋(beam search) 方法是解決優化問題的一種啟發式方法,它是在分枝定界方法基礎上發展起來的,它使用啟發式方法估計k 個最好的路徑,僅從這k 個路徑出發向下搜尋,即每一層只有滿意的結點會被保留,其它的結點則被永久拋棄,從而比分枝定界法能大大節省執行時間。束搜尋於20 世紀70 年代中期首先被應用於人工智慧領域,1976 年Lowerre 在其稱為HARPY的語音識別系統中第一次使用了束搜尋方法,他的目標是並行地搜尋幾個潛在的最優決策路徑以減少回溯,並快速地獲得一個解。 - 二分取中查詢演算法
一種在有序陣列中查詢某一特定元素的搜尋演算法。搜素過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。 - Branch and bound
分支定界 (branch and bound) 演算法是一種在問題的解空間樹上搜尋問題的解的方法。但與回溯演算法不同,分支定界演算法採用廣度優先或最小耗費優先的方法搜尋解空間樹,並且,在分支定界演算法中,每一個活結點只有一次機會成為擴充套件結點。 - 資料壓縮
資料壓縮是通過減少計算機中所儲存資料或者通訊傳播中資料的冗餘度,達到增大資料密度,最終使資料的儲存空間減少的技術。資料壓縮在檔案儲存和分散式系統領域有著十分廣泛的應用。資料壓縮也代表著尺寸媒介容量的增大和網路頻寬的擴充套件。 - Diffie–Hellman金鑰協商
Diffie–Hellman key exchange,簡稱“D–H”, 是一種安全協議。它可以讓雙方在完全沒有對方任何預先資訊的條件下通過不安全通道建立起一個金鑰。這個金鑰可以在後續的通訊中作為對稱金鑰來加密通訊內容。 - Dijkstra’s 演算法
迪科斯徹演算法(Dijkstra)是由荷蘭電腦科學家艾茲格·迪科斯徹(Edsger Wybe Dijkstra)發明的。演算法解決的是有向圖中單個源點到其他頂點的最短路徑問題。舉例來說,如果圖中的頂點表示城市,而邊上的權重表示著城市間開車行經的距離,迪科斯徹演算法可以用來找到兩個城市之間的最短路徑。 - 動態規劃
動態規劃是一種在數學和電腦科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。比較著名的應用例項有:求解最短路徑問題,揹包問題,專案管理,網路流優化等。這裡也有一篇文章說得比較詳細。 - 歐幾里得演算法
在數學中,輾轉相除法,又稱歐幾里得演算法,是求最大公約數的演算法。輾轉相除法首次出現於歐幾里得的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至東漢出現的《九章算術》。 - 最大期望(EM)演算法
在統計計算中,最大期望(EM)演算法是在概率(probabilistic)模型中尋找引數最大似然估計的演算法,其中概率模型依賴於無法觀測的隱藏變數(Latent Variable)。最大期望經常用在機器學習和計算機視覺的資料聚類(Data Clustering)領域。最大期望演算法經過兩個步驟交替進行計算,第一步是計算期望(E),利用對隱藏變數的現有估計值,計算其最大似然估計值;第二步是最大化(M),最大化在 E 步上求得的最大似然值來計算引數的值。M 步上找到的引數估計值被用於下一個 E 步計算中,這個過程不斷交替進行。 - 快速傅立葉變換 (FFT)
快速傅立葉變換(Fast Fourier Transform,FFT),是離散傅立葉變換的快速演算法,也可用於計算離散傅立葉變換的逆變換。快速傅立葉變換有廣泛的應用,如數字訊號處理、計算大整數乘法、求解偏微分方程等等。本條目只描述各種快速演算法,對於離散傅立葉變換的性質和應用,請參見離散傅立葉變換。 - 雜湊函式
Hash Function是一種從任何一種資料中建立小的數字“指紋”的方法。該函式將資料打亂混合,重新建立一個叫做雜湊值的指紋。雜湊值通常用來代表一個短的隨機字母和數字組成的字串。好的雜湊函式在輸入域中很少出現雜湊衝突。在雜湊表和資料處理中,不抑制衝突來區別資料,會使得資料庫記錄更難找到。 - 堆排序
Heapsort 是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法。堆積樹是一個近似完全二叉樹的結構,並同時滿足堆積屬性:即子結點的鍵值或索引總是小於(或者大於)它的父結點。 - 歸併排序
Merge sort是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。 - RANSAC 演算法
RANSAC 是”RANdom SAmple Consensus”的縮寫。該演算法是用於從一組觀測資料中估計數學模型引數的迭代方法,由Fischler and Bolles在1981 提出,它是一種非確定性演算法,因為它只能以一定的概率得到合理的結果,隨著迭代次數的增加,這種概率是增加的。 該演算法的基本假設是觀測資料集中存在”inliers”(那些對模型引數估計起到支援作用的點)和”outliers”(不符合模型的點),並且這組觀測資料受到噪聲影響。RANSAC 假設給定一組”inliers”資料就能夠得到最優的符合這組點的模型。 - RSA加密演演算法
這是一個公鑰加密演算法,也是世界上第一個適合用來做簽名的演算法。今天的RSA已經專利失效,其被廣泛地用於電子商務加密,大家都相信,只要金鑰足夠長,這個演算法就會是安全的 - 並查集Union-find
並查集是一種樹型的資料結構,用於處理一些不相交集合(Disjoint Sets)的合併及查詢問題。常常在使用中以森林來表示。 - Viterbi algorithm
尋找最可能的隱藏狀態序列(Finding most probable sequence of hidden states)
附錄
- 關於這個世界上的演算法,你可以看看Wikipedia的這個網頁:http://en.wikipedia.org/wiki/List_of_algorithms
- 關於排序演算法,你可以看看本站的這幾篇文章《一個顯示排序過程的Python指令碼》、《一個排序演算法比較的網站》
相關文章
- [轉載] 陳皓——程式設計師技術練級攻略程式設計師
- 陳皓:給程式設計師新手的一些建議程式設計師
- 陳皓:一個 fork 的面試題面試題
- 陳皓:程式碼執行的效率
- 陳皓:C++的坑真的多嗎?C++
- 陳皓:為什麼我反對純演算法面試題演算法面試題
- 陳皓:Why C++ ? 王者歸來C++
- 什麼是工程師文化?-陳皓工程師
- 陳皓:程式設計師技術練級攻略程式設計師
- 陳皓:關於閏秒(leap second)的小知識
- 陳皓:做個環保主義的程式設計師程式設計師
- 陳皓(@左耳朵耗子):我的精神家園(圖靈訪談)圖靈
- 陳皓談程式設計師的升級:職業規劃就像軟體工程程式設計師軟體工程
- Linux下的makefile編寫 ——陳皓《跟我一起寫Makefile》學習筆記(二)Linux筆記
- 關於演算法的一些想法 (轉)演算法
- spark 一些重要概念Spark
- [轉載]DSA演算法演算法
- [轉載]RSA演算法演算法
- [轉載]ElGamal演算法GAM演算法
- C# 一些常用的框架分享(轉載)C#框架
- Perl的一些重要模組使用介紹
- 演算法還是最重要的演算法
- 陳安之課程資料下載
- Linux一些重要的標頭檔案Linux
- 一些重要 Docker 命令的簡單介紹Docker
- VI的一些最常用命令和一些高階的應用(轉載)
- IT依然重要 CIO轉型至關重要
- 關於一些爬蟲專案教程的整理(轉載)爬蟲
- 零基預演算法(轉載)演算法
- 演算法的力量,李開復聊演算法的重要性演算法
- Docker關聯使用的一些工具:Clip名字服務(轉載)Docker
- Javascript函數語言程式設計的一些例子[轉載]JavaScript函數程式設計
- mysqldump的一些記載MySql
- AmS中的一些重要排程相關變數變數
- 轉載:C++之高精度演算法C++演算法
- Java排序演算法速度比較(轉載)Java排序演算法
- python的重要的圖數學演算法教程Python演算法
- ORACLE最重要的引數資訊 (轉)Oracle