[轉]幾種最短路徑算法的比較



用於解決最短路徑問題的算法被稱做“最短路徑算法”,有時被簡稱作“路徑算法”。最常用的路徑算法有:

Dijkstra算法、A*算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法,本文主要介紹其中的三種。
最短路徑問題是圖論研究中的一個經典算法問題,旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路
徑。

算法具體的形式包括:
確定起點的最短路徑問題:即已知起始結點,求最短路徑的問題。
確定終點的最短路徑問題:與確定起點的問題相反,該問題是已知終結結點,求最短路徑的問題。在無向圖中
該問題與確定起點的問題完全等同,在有向圖中該問題等同於把所有路徑方向反轉的確定起點的問題。
確定起點終點的最短路徑問題:即已知起點和終點,求兩結點之間的最短路徑。
全局最短路徑問題:求圖中所有的最短路徑。

Floyd
求多源、無負權邊的最短路。用矩陣記錄圖。時效性較差,時間複雜度O(V^3)。
Floyd-Warshall算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種算法,可以正確處理
有向圖或負權的最短路徑問題。
Floyd-Warshall算法的時間複雜度爲O(N^3),空間複雜度爲O(N^2)。
Floyd-Warshall的原理是動態規劃:
設Di,j,k爲從i到j的只以(1..k)集合中的節點爲中間節點的最短路徑的長度。
若最短路徑經過點k,則Di,j,k = Di,k,k-1 + Dk,j,k-1;
若最短路徑不經過點k,則Di,j,k = Di,j,k-1。
因此,Di,j,k = min(Di,k,k-1 + Dk,j,k-1 , Di,j,k-1)。
在實際算法中,爲了節約空間,可以直接在原來空間上進行迭代,這樣空間可降至二維。

Floyd-Warshall算法的描述如下:
for k ← 1 to n do 
for i ← 1 to n do 
for j ← 1 to n do 
if (Di,k + Dk,j < Di,j) then  
Di,j ← Di,k + Dk,j; 

其中Di,j表示由點i到點j的代價,當Di,j爲 ∞ 表示兩點之間沒有任何連接。


Dijkstra
求單源、無負權的最短路。時效性較好,時間複雜度爲O(V*V+E),可以用優先隊列進行優化,優化後時間複雜
度變爲0(v*lgn)。
源點可達的話,O(V*lgV+E*lgV)=>O(E*lgV)。
當是稀疏圖的情況時,此時E=V*V/lgV,所以算法的時間複雜度可爲O(V^2) 。可以用優先隊列進行優化,優
化後時間複雜度變爲0(v*lgn)。
Bellman-Ford
求單源最短路,可以判斷有無負權迴路(若有,則不存在最短路),時效性較好,時間複雜度O(VE)。
Bellman-Ford算法是求解單源最短路徑問題的一種算法。
單源點的最短路徑問題是指:給定一個加權有向圖G和源點s,對於圖G中的任意一點v,求從s到v的最短路徑。
與Dijkstra算法不同的是,在Bellman-Ford算法中,邊的權值可以爲負數。設想從我們可以從圖中找到一個環
路(即從v出發,經過若干個點之後又回到v)且這個環路中所有邊的權值之和爲負。那麼通過這個環路,環路
中任意兩點的最短路徑就可以無窮小下去。如果不處理這個負環路,程序就會永遠運行下去。 而Bellman-Ford
算法具有分辨這種負環路的能力。

SPFA
是Bellman-Ford的隊列優化,時效性相對好,時間複雜度O(kE)。(k<<v)。
 與Bellman-ford算法類似,SPFA算法採用一系列的鬆弛操作以得到從某一個節點出發到達圖中其它所有節點的
最短路徑。所不同的是,SPFA算法通過維護一個隊列,使得一個節點的當前最短路徑被更新之後沒有必要立刻
去更新其他的節點,從而大大減少了重複的操作次數。
SPFA算法可以用於存在負數邊權的圖,這與dijkstra算法是不同的。
與Dijkstra算法與Bellman-ford算法都不同,SPFA的算法時間效率是不穩定的,即它對於不同的圖所需要的時
間有很大的差別。
在最好情形下,每一個節點都只入隊一次,則算法實際上變爲廣度優先遍歷,其時間複雜度僅爲O(E)。另一方
面,存在這樣的例子,使得每一個節點都被入隊(V-1)次,此時算法退化爲Bellman-ford算法,其時間複雜度爲
O(VE)。
SPFA算法在負邊權圖上可以完全取代Bellman-ford算法,另外在稀疏圖中也表現良好。但是在非負邊權圖中,


爲了避免最壞情況的出現,通常使用效率更加穩定的Dijkstra算法,以及它的使用堆優化的版本。通常的SPFA


來源:http://blog.chinaunix.net/uid-27164517-id-3287891.html



發佈了329 篇原創文章 · 獲贊 319 · 訪問量 463萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章