用於解決最短路徑問題的演算法被稱做「最短路徑演算法」,有時被簡稱作「路徑演算法」。最常用的路徑演算法有:
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<
幾大最短路徑演算法比較
july 二零一一年二月十二日。幾個最短路徑演算法的比較 floyd 求多源 無負權邊的最短路。用矩陣記錄圖。時效性較差,時間複雜度o v 3 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短...
幾大最短路徑演算法簡述
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演算法,本文主要介紹其中的三種。最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖...