幾大最短路徑演算法比較

2021-06-29 01:19:22 字數 2176 閱讀 5758

july、二零一一年二月十二日。

----------------------------------- 

幾個最短路徑演算法的比較:

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)。

源點可達的話,o(v*lgv+e*lgv)=>o(e*lgv)。

當是稀疏圖的情況時,此時e=v*v/lgv,所以演算法的時間複雜度可為o(v^2)。若是斐波那契堆作優先佇列的話,演算法時間複雜度,則為o(v*lgv + e)。

更多,請參考:二(續)、徹底理解dijkstra演算法,及二(再續)、dijkstra 演算法+fibonacci堆的逐步c實現

bellman-ford

求單源最短路,可以判斷有無負權迴路(若有,則不存在最短路),

時效性較好,時間複雜度o(ve)。此演算法日後還會在本blog內具體闡述。

bellman-ford演算法是求解單源最短路徑問題的一種演算法。

單源點的最短路徑問題是指:

給定乙個加權有向圖g和源點s,對於圖g中的任意一點v,求從s到v的最短路徑。

與dijkstra演算法不同的是,在bellman-ford演算法中,邊的權值可以為負數。

設想從我們可以從圖中找到乙個環路(即從v出發,經過若干個點之後又回到v)且這個環路中所有邊的權值之和為負。那麼通過這個環路,環路中任意兩點的最短路徑就可以無窮小下去。如果不處理這個負環路,程式就會永遠執行下去。 而bellman-ford演算法具有分辨這種負環路的能力。

spfa

是bellman-ford的佇列優化,時效性相對好,時間複雜度o(ke)。(k《與bellman-ford演算法類似,spfa演算法採用一系列的鬆弛操作以得到從某乙個節點出發到達圖中其它所有節點的最短路徑。所不同的是,spfa演算法通過維護乙個佇列,使得乙個節點的當前最短路徑被更新之後沒有必要立刻去更新其他的節點,從而大大減少了重複的操作次數。

spfa演算法可以用於存在負數邊權的圖,這與dijkstra演算法是不同的。

與dijkstra演算法與bellman-ford演算法不同,spfa的演算法時間效率是不穩定的,即它對於不同的圖所需要的時間有很大的差別。

在最好情形下,每乙個節點都只入隊一次,則演算法實際上變為廣度優先遍歷,其時間複雜度僅為o(e)。另一方面,存在這樣的例子,使得每乙個節點都被入隊(v-1)次,此時演算法退化為bellman-ford演算法,其時間複雜度為o(ve)。

spfa演算法在負邊權圖上可以完全取代bellman-ford演算法,另外在稀疏圖中也表現良好。但是在非負邊權圖中,為了避免最壞情況的出現,通常使用效率更加穩定的dijkstra演算法,以及它的使用堆優化的版本。通常的spfa演算法在一類網格圖中的表現不盡如人意。

完。

幾大最短路徑演算法比較

用於解決最短路徑問題的演算法被稱做 最短路徑演算法 有時被簡稱作 路徑演算法 最常用的路徑演算法有 dijkstra演算法 a 演算法 spfa演算法 bellman ford演算法和floyd warshall演算法,本文主要介紹其中的三種。最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖...

幾大最短路徑演算法簡述

floyd warshall演算法過程簡述 時間複雜度o n 3 若a點到b點直接舉例不為最短距離,則他們之間必有中間點,首先假設點k為中間點,若a k k b小於a b則將a b更新為 a k k b,遍歷所有兩點間的組合 以 k i 12 2 2 3 5 3 1 6 每迴圈一遍這個環,最短路徑就...

最短路徑演算法比較

用於解決最短路徑問題的演算法被稱做 最短路徑演算法 有時被簡稱作 路徑演算法 最常用的路徑演算法有 dijkstra演算法 a 演算法 spfa演算法 bellman ford演算法和floyd warshall演算法,本文主要介紹其中的三種。最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖...