1. 在計算機科學中,有哪些非常巧妙的演算法
分支界定演算法(Branch and Bound)——在多種最優化問題中尋找特定最優化解決方案的演算法,特別是針對離散、組合的最優化。Buchberger演算法——一種數學演算法,可將其視為針對單變數最大公約數求解的歐幾里得演算法和線性系統中高斯消元法的泛化。
動態規劃演算法(Dynamic Programming)——展示互相覆蓋的子問題和最優子架構演算法
歐幾里得演算法(Euclidean algorithm)——計算兩個整數的最大公約數。最古老的演算法之一,出現在公元前300前歐幾里得的《幾何原本》。
期望-最大演算法(Expectation-maximization algorithm,又名EM-Training)——在統計計算中,期望-最大演算法在概率模型中尋找可能性最大的參數估算值,其中模型依賴於未發現的潛在變數。EM在兩個步驟中交替計算,第一步是計算期望,利用對隱藏變數的現有估計值,計算其最大可能估計值;第二步是最大化,最大化在第一步上求得的最大可能值來計算參數的值
2. 風靡全球的十大演算法
作者 | George Dvorsky
編譯 | 深度學習這件小事
1 排序演算法
所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。排序演算法在很多領域得到相當地重視,尤其是在大量數據的處理方面。一個優秀的演算法可以節省大量的資源。
穩定的
冒泡排序(bubble sort) — O(n^2) 雞尾酒排序(Cocktail sort,雙向的冒泡排序) — O(n^2) 插入排序(insertion sort)— O(n^2) 桶排序(bucket sort)— O(n); 需要 O(k) 額外空間 計數排序(counting sort) — O(n+k); 需要 O(n+k) 額外空間 合並排序(merge sort)— O(nlog n);需要 O(n) 額外空間 原地合並排序— O(n^2) 二叉排序樹排序 (Binary tree sort) — O(nlog n)期望時間; O(n^2)最壞時間;需要 O(n) 額外空間 鴿巢排序(Pigeonhole sort)— O(n+k); 需要 O(k) 額外空間 基數排序(radix sort)— O(n·k); 需要 O(n) 額外空間 Gnome 排序— O(n^2) 圖書館排序— O(nlog n) withhigh probability,需要(1+ε)n額外空間不穩定的
選擇排序(selection sort)— O(n^2) 希爾排序(shell sort)— O(nlog n) 如果使用最佳的現在版本 組合排序— O(nlog n) 堆排序(heapsort)— O(nlog n) 平滑排序— O(nlog n) 快速排序(quicksort)— O(nlog n) 期望時間,O(n^2) 最壞情況;對於大的、亂數列表一般相信是最快的已知排序 Introsort—O(nlog n) Patience sorting— O(nlog n+k) 最壞情況時間,需要額外的 O(n+ k) 空間,也需要找到最長的遞增子串列(longest increasing subsequence)不實用的
Bogo排序— O(n× n!) 期望時間,無窮的最壞情況。 Stupid sort— O(n^3); 遞歸版本需要 O(n^2)額外存儲器 珠排序(Bead sort) — O(n) or O(√n),但需要特別的硬體 Pancake sorting— O(n),但需要特別的硬體 stooge sort——O(n^2.7)很漂亮但是很耗時2 傅立葉變換與快速傅立葉變換
傅立葉是一位法國數學家和物理學家,原名是JeanBaptiste Joseph Fourier(1768-1830), Fourier於1807年在法國科學學會上發表了一篇論文,論文里描述運用正弦曲線來描述溫度分布,論文里有個在當時具有爭議性的決斷:任何連續周期信號都可以由一組適當的正弦曲線組合而成。當時審查這個論文拉格朗日堅決反對此論文的發表,而後在近50年的時間里,拉格朗日堅持認為傅立葉的方法無法表示帶有稜角的信號,如在方波中出現非連續變化斜率。直到拉格朗日死後15年這個論文才被發表出來。誰是對的呢?拉格朗日是對的:正弦曲線無法組合成一個帶有稜角的信號。但是,我們可以用正弦曲線來非常逼近地表示它,逼近到兩種表示方法不存在能量差別,基於此,傅立葉是對的。為什麼我們要用正弦曲線來代替原來的曲線呢?如我們也還可以用方波或三角波來代替呀,分解信號的方法是無窮多的,但分解信號的目的是為了更加簡單地處理原來的信號。用正餘弦來表示原信號會更加簡單,因為正餘弦擁有原信號所不具有的性質:正弦曲線保真度。一個正餘弦曲線信號輸入後,輸出的仍是正餘弦曲線,只有幅度和相位可能發生變化,但是頻率和波的形狀仍是一樣的。且只有正餘弦曲線才擁有這樣的性質,正因如此我們才不用方波或三角波來表示。
3 Dijkstra 演算法
Dijkstra演算法是典型的演算法。Dijkstra演算法是很有代表性的演算法。Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN, CLOSE表的方式,這里均採用永久和臨時標號的方式。注意該演算法要求圖中不存在負權邊。
4 RSA演算法變換
RSA是目前最有影響力的公鑰加密演算法,它能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被ISO推薦為公鑰數據加密標准。今天只有短的RSA鑰匙才可能被強力方式解破。到2008年為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實際上是不能被解破的。但在分布式計算和量子計算機理論日趨成熟的今天,RSA加密安全性受到了挑戰。
5 安全哈希演算法
一種對輸入信息(例如消息)進行摘要的演算法。摘要過程能夠完成下列特點:不同的輸入信息絕對不會具有相同的指紋:相近輸入信息經過摘要之後的輸出信息具有較大的差異,同時計算上很難生產一個與給定輸入具有相同指紋的輸入。(即不可逆)。
6 整數因式分解
這是在計算機領域被大量使用的數學演算法,沒有這個演算法,信息加密會更不安全。該演算法定義了一系列步驟,得到將一合數分解為更小因子的質數分解式。這被認為是一種FNP問題,它是NP分類問題的延伸,極其難以解決。許多加密協議(如RSA演算法)都基於這樣一個原理:對大的合數作因式分解是非常困難的。如果一個演算法能夠快速地對任意整數進行因式分解,RSA的公鑰加密體系就會失去其安全性。量子計算的誕生使我們能夠更容易地解決這類問題,同時它也打開了一個全新的領域,使得我們能夠利用量子世界中的特性來保證系統安全。
7 鏈接分析
鏈接分析,源於對Web結構中超鏈接的多維分析。當前其應用主要體現在網路信息檢索、網路計量學、數據挖掘、Web結構建模等方山。作為Google的核心技術之一,鏈接分析演算法應用已經顯現出j驚人的商業價值。
8 比例積分微分演算法
你是否曾經用過飛機、汽車、衛星服務或手機網路?你是否曾經在工廠工作或是看見過機器人?如果回答是肯定的,那麼你應該已經見識過這個演算法了。大體上,這個演算法使用一種控制迴路反饋機制,將期望輸出信號和實際輸出信號之間的錯誤最小化。無論何處,只要你需要進行信號處理,或者你需要一套電子系統,用來自動化控制機械、液壓或熱力系統,這個演算法都會有用武之地。可以這樣說,如果沒有這個演算法,現代文明將不復存在。
9 數據壓縮演算法
在現今的電子信息技術領域,正發生著一場有長遠影響的數字化革命。由於數字化的多媒體信息尤其是數字視頻、音頻信號的數據量特別龐大,如果不對其進行有效的壓縮就難以得到實際的應用。因此,數據壓縮技術已成為當今數字通信、廣播、存儲和多媒體娛樂中的一項關鍵的共性技術。
10 隨機數生成
在統計學的不同技術中需要使用隨機數,比如在從統計總體中抽取有代表性的樣本的時候,或者在將實驗動物分配到不同的試驗組的過程中,或者在進行蒙特卡羅模擬法計算的時候等等。
3. 誰有數學建模十大演算法的詳細介紹啊
1、蒙特卡羅演算法(該演算法又稱隨機性模擬演算法,是通過計算機模擬來解決問題的演算法,
同時可以通過模擬可以來檢驗自己模型的正確性,是比賽時必用的方法)
2、數據擬合、參數估計、插值等數據處理演算法(比賽中通常會遇到大量的數據需要處理,
而處理數據的關鍵就在於這些演算法,通常使用Matlab作為工具)
3、線性規劃、整數規劃、多元規劃、二次規劃等規劃類問題(建模競賽大多數問題屬於最優化問題,
很多時候這些問題可以用數學規劃演算法來描述,通常使用Lindo、Lingo軟體實現)
4、圖論演算法(這類演算法可以分為很多種,包括最短路、網路流、二分圖等演算法,
涉及到圖論的問題可以用這些方法解決,需要認真准備)
5、動態規劃、回溯搜索、分治演算法、分支定界等計算機演算法(這些演算法是演算法設計中比較常用的方法,很多場合可以用到競賽中)
6、最優化理論的三大非經典演算法:模擬退火法、神經網路、遺傳演算法
(這些問題是用來解決一些較困難的最優化問題的演算法,對於有些問題非常有幫助,
但是演算法的實現比較困難,需慎重使用)
7、網格演算法和窮舉法(網格演算法和窮舉法都是暴力搜索最優點的演算法,在很多競賽題中有應用,
當重點討論模型本身而輕視演算法的時候,可以使用這種暴力方案,最好使用一些高級語言作為編程工具)
8、一些連續離散化方法(很多問題都是實際來的,數據可以是連續的,而計算機只認的是離散的數據,因此將其離散化後進行差分代替微分、求和代替積分等思想是非常重要的)
9、數值分析演算法(如果在比賽中採用高級語言進行編程的話,那一些數值分析中常用的演算法比
如方程組求解、矩陣運算、函數積分等演算法就需要額外編寫庫函數進行調用)
10、圖象處理演算法(賽題中有一類問題與圖形有關,即使與圖形無關,論文中也應該要不乏圖片的,
這些圖形如何展示以及如何處理就是需要解決的問題,通常使用Matlab進行處理)
4. 計算機演算法有哪些
計算機演算法指的是編程的時候,我們有各種不同的程序,不同的應用,有不同的演算法,這個演算法有很多很多
5. 計算機進制的演算法,求過程
以前學過的都快忘記了,我剛去網上看了一下
十進制26.75轉化為二進制:
先整數跟小數分開:26.75=26+0.75
用整數部分去除以2:26/2=13----餘0,
13/2=6-----餘1,
6/2=3------餘0,
3/2=1------餘1,
即11010
然後用小數部分去乘以2:
0.75*2=1.5
取整是1
0.5*2=1
取整是1
即0.11
最後合起來11010.11(B)
十六進制F6.B8H轉化為8進制:應該可以直接轉化,我還不知道,你先可以把16進制轉化為2進制,然後把2進制轉化為8進制
還是跟上面一樣,先把整數跟小數分開
整數部分F6轉化為二進制:F6=1111
0110
二進制整數部分轉化為8進制:011
110
110
=366
小數部分B8轉化為二進制:B8=1011
1000
二進制小數部分轉化為8進制:010
111
000=270
即轉化為366.270(Q)
二進制
八進制
000
0
001
1
010
2
011
3
100
4
101
5
110
6
111
7
二進制
十六進制
1111
=
8
+
4
+
2
+
1
=
15
F
1110
=
8
+
4
+
2
+
0
=
14
E
1101
=
8
+
4
+
0
+
1
=
13
D
1100
=
8
+
4
+
0
+
0
=
12
C
1011
=
8
+
0
+
2+
1
=
11
B
1010
=
8
+
0
+
2
+
0
=
10
A
1001
=
8
+
0
+
0
+
1
=
9
9
...........................
0001
=
0
+
0
+
0
+
1
=
1
1
0000
=
0
+
0
+
0
+
0
=
0
0
6. 計算機常用演算法有哪些
貪心演算法,蟻群演算法,遺傳演算法,進化演算法,基於文化的遺傳演算法,禁忌演算法,蒙特卡洛演算法,混沌隨機演算法,序貫數論演算法,粒子群演算法,模擬退火演算法。
模擬退火+遺傳演算法混合編程例子:
http://..com/question/43266691.html
自適應序貫數論演算法例子:
http://..com/question/60173220.html
7. 計算機專業學演算法的都學些什麼演算法,有什麼書可以看的學的話需要些什麼基礎的
計算機演算法非常多的
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),是離散傅里葉變換的快速演算法,也可用於計算離散傅里葉變換的逆變換。快速傅里葉變換有廣泛的應用,如數字信號處理、計算大整數乘法、求解偏微分方程等等。
哈希函數
HashFunction是一種從任何一種數據中創建小的數字「指紋」的方法。該函數將數據打亂混合,重新創建一個叫做散列值的指紋。散列值通常用來代表一個短的隨機字母和數字組成的字元串。好的散列函數在輸入域中很少出現散列沖突。在散列表和數據處理中,不抑制沖突來區別數據,會使得資料庫記錄更難找到。
堆排序
Heapsort是指利用堆積樹(堆)這種數據結構所設計的一種排序演算法。堆積樹是一個近似完全二叉樹的結構,並同時滿足堆積屬性:即子結點的鍵值或索引總是小於(或者大於)它的父結點。
歸並排序
Merge sort是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
RANSAC 演算法
RANSAC 是」RANdom SAmpleConsensus」的縮寫。該演算法是用於從一組觀測數據中估計數學模型參數的迭代方法,由Fischler and Bolles在1981提出,它是一種非確定性演算法,因為它只能以一定的概率得到合理的結果,隨著迭代次數的增加,這種概率是增加的。該演算法的基本假設是觀測數據集中存在」inliers」(那些對模型參數估計起到支持作用的點)和」outliers」(不符合模型的點),並且這組觀測數據受到雜訊影響。RANSAC 假設給定一組」inliers」數據就能夠得到最優的符合這組點的模型。
RSA加密演演算法
這是一個公鑰加密演算法,也是世界上第一個適合用來做簽名的演算法。今天的RSA已經專利失效,其被廣泛地用於電子商務加密,大家都相信,只要密鑰足夠長,這個演算法就會是安全的。
並查集Union-find
並查集是一種樹型的數據結構,用於處理一些不相交集合(Disjoint Sets)的合並及查詢問題。常常在使用中以森林來表示。
Viterbi algorithm
尋找最可能的隱藏狀態序列(Finding most probable sequence of hidden states)。
8. 計算機十大經典演算法有哪些
再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,逆著這個行進方向,從終點向始點計算,在選定系統行進方向之後,常比線性規劃法更為有效,由每個階段都作出決策,從而使整個過程達到最優化。所謂多階段決策過程,特別是對於那些離散型問題。實際上,動態規劃法就是分多階段進行決策,其基本思路是,原問題的解即子問題的解的合並
不好意思啊,就是把研究問題分成若干個相互聯系的階段,逐次對每個階段尋找某種決策,用來解決多階段決策過程問題的一種最優化方法,就是把一個復雜的問題分成兩個或更多的相同或相似的子問題:按時空特點將復雜問題劃分為相互聯系的若干個階段。字面上的解釋是「分而治之」動態規劃法[dynamic
programming
method
(dp)]是系統分析中一種常用的方法。在水資源規劃中,往往涉及到地表水庫調度、水資源量的合理分配、優化調度等問題,而這些問題又可概化為多階段決策過程問題。動態規劃法是解決此類問題的有效方法。動態規劃法是20世紀50年代由貝爾曼(r,使整個過程達到最優.
bellman)等人提出。許多實際問題利用動態規劃法處理,故又稱為逆序決策過程。
回溯法是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。
在計算機科學中,分治法是一種很重要的演算法
9. 程序員開發用到的十大基本演算法
演算法一:快速排序演算法
快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 演算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。
快速排序使用分治法(Divide and conquer)策略來把一個串列(list)分為兩個子串列(sub-lists)。
演算法步驟:
1 從數列中挑出一個元素,稱為 「基準」(pivot),
2 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱為分區(partition)操作。
3 遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。
演算法二:堆排序演算法
堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。堆排序的平均時間復雜度為Ο(nlogn) 。
演算法步驟:
1.創建一個堆H[0..n-1]
2.把堆首(最大值)和堆尾互換
3.把堆的尺寸縮小1,並調用shift_down(0),目的是把新的數組頂端數據調整到相應位置
4.重復步驟2,直到堆的尺寸為1
演算法三:歸並排序
歸並排序(Merge sort,台灣譯作:合並排序)是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
演算法步驟:
演算法四:二分查找演算法
二分查找演算法是一種在有序數組中查找某一特定元素的搜索演算法。搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜 素過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數組 為空,則代表找不到。這種搜索演算法每一次比較都使搜索范圍縮小一半。折半搜索每次把搜索區域減少一半,時間復雜度為Ο(logn) 。
演算法五:BFPRT(線性查找演算法)
BFPRT演算法解決的問題十分經典,即從某n個元素的序列中選出第k大(第k小)的元素,通過巧妙的分 析,BFPRT可以保證在最壞情況下仍為線性時間復雜度。該演算法的思想與快速排序思想相似,當然,為使得演算法在最壞情況下,依然能達到o(n)的時間復雜 度,五位演算法作者做了精妙的處理。
演算法步驟:
終止條件:n=1時,返回的即是i小元素。
演算法六:DFS(深度優先搜索)
深度優先搜索演算法(Depth-First-Search),是搜索演算法的一種。它沿著樹的深度遍歷樹的節點,盡可能深的搜索樹的分 支。當節點v的所有邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發 現的節點,則選擇其中一個作為源節點並重復以上過程,整個進程反復進行直到所有節點都被訪問為止。DFS屬於盲目搜索。
深度優先搜索是圖論中的經典演算法,利用深度優先搜索演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。一般用堆數據結構來輔助實現DFS演算法。
演算法步驟:
上述描述可能比較抽象,舉個實例:
DFS 在訪問圖中某一起始頂點 v 後,由 v 出發,訪問它的任一鄰接頂點 w1;再從 w1 出發,訪問與 w1鄰 接但還沒有訪問過的頂點 w2;然後再從 w2 出發,進行類似的訪問,… 如此進行下去,直至到達所有的鄰接頂點都被訪問過的頂點 u 為止。
接著,退回一步,退到前一次剛訪問過的頂點,看是否還有其它沒有被訪問的鄰接頂點。如果有,則訪問此頂點,之後再從此頂點出發,進行與前述類似的訪問;如果沒有,就再退回一步進行搜索。重復上述過程,直到連通圖中所有頂點都被訪問過為止。
演算法七:BFS(廣度優先搜索)
廣度優先搜索演算法(Breadth-First-Search),是一種圖形搜索演算法。簡單的說,BFS是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。如果所有節點均被訪問,則演算法中止。BFS同樣屬於盲目搜索。一般用隊列數據結構來輔助實現BFS演算法。
演算法步驟:
演算法八:Dijkstra演算法
戴克斯特拉演算法(Dijkstra』s algorithm)是由荷蘭計算機科學家艾茲赫爾·戴克斯特拉提出。迪科斯徹演算法使用了廣度優先搜索解決非負權有向圖的單源最短路徑問題,演算法最終得到一個最短路徑樹。該演算法常用於路由演算法或者作為其他圖演算法的一個子模塊。
該演算法的輸入包含了一個有權重的有向圖 G,以及G中的一個來源頂點 S。我們以 V 表示 G 中所有頂點的集合。每一個圖中的邊,都是兩個頂點所形成的有序元素對。(u, v) 表示從頂點 u 到 v 有路徑相連。我們以 E 表示G中所有邊的集合,而邊的權重則由權重函數 w: E → [0, ∞] 定義。因此,w(u, v) 就是從頂點 u 到頂點 v 的非負權重(weight)。邊的權重可以想像成兩個頂點之間的距離。任兩點間路徑的權重,就是該路徑上所有邊的權重總和。已知有 V 中有頂點 s 及 t,Dijkstra 演算法可以找到 s 到 t的最低權重路徑(例如,最短路徑)。這個演算法也可以在一個圖中,找到從一個頂點 s 到任何其他頂點的最短路徑。對於不含負權的有向圖,Dijkstra演算法是目前已知的最快的單源最短路徑演算法。
演算法步驟:
重復上述步驟2、3,直到S中包含所有頂點,即W=Vi為止
演算法九:動態規劃演算法
動態規劃(Dynamic programming)是一種在數學、計算機科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解復雜問題的方法。 動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。
動態規劃背後的基本思想非常簡單。大致上,若要解一個給定問題,我們需要解其不同部分(即子問題),再合並子問題的解以得出原問題的解。 通常許多 子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量: 一旦某個給定子問題的解已經算出,則將其記憶化存儲,以便下次需要同一個 子問題解之時直接查表。 這種做法在重復子問題的數目關於輸入的規模呈指數增長時特別有用。
關於動態規劃最經典的問題當屬背包問題。
演算法步驟:
演算法十:樸素貝葉斯分類演算法
樸素貝葉斯分類演算法是一種基於貝葉斯定理的簡單概率分類演算法。貝葉斯分類的基礎是概率推理,就是在各種條件的存在不確定,僅知其出現概率的情況下, 如何完成推理和決策任務。概率推理是與確定性推理相對應的。而樸素貝葉斯分類器是基於獨立假設的,即假設樣本每個特徵與其他特徵都不相關。
樸素貝葉斯分類器依靠精確的自然概率模型,在有監督學習的樣本集中能獲取得非常好的分類效果。在許多實際應用中,樸素貝葉斯模型參數估計使用最大似然估計方法,換言之樸素貝葉斯模型能工作並沒有用到貝葉斯概率或者任何貝葉斯模型。
盡管是帶著這些樸素思想和過於簡單化的假設,但樸素貝葉斯分類器在很多復雜的現實情形中仍能夠取得相當好的效果。