几大最短路径算法比较
生活随笔
收集整理的這篇文章主要介紹了
几大最短路径算法比较
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
用于解決最短路徑問題的算法被稱做“最短路徑算法”,有時被簡稱作“路徑算法”。最常用的路徑算法有:
Dijkstra算法、A*算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法,本文主要介紹其中的三種。
最短路徑問題是圖論研究中的一個經(jīng)典算法問題,旨在尋找圖(由結(jié)點(diǎn)和路徑組成的)中兩結(jié)點(diǎn)之間的最短路
徑。
算法具體的形式包括:
確定起點(diǎn)的最短路徑問題:即已知起始結(jié)點(diǎn),求最短路徑的問題。
確定終點(diǎn)的最短路徑問題:與確定起點(diǎn)的問題相反,該問題是已知終結(jié)結(jié)點(diǎn),求最短路徑的問題。在無向圖中
該問題與確定起點(diǎn)的問題完全等同,在有向圖中該問題等同于把所有路徑方向反轉(zhuǎn)的確定起點(diǎn)的問題。
確定起點(diǎn)終點(diǎn)的最短路徑問題:即已知起點(diǎn)和終點(diǎn),求兩結(jié)點(diǎn)之間的最短路徑。
全局最短路徑問題:求圖中所有的最短路徑。
Floyd
求多源、無負(fù)權(quán)邊的最短路。用矩陣記錄圖。時效性較差,時間復(fù)雜度O(V^3)。
Floyd-Warshall算法(Floyd-Warshall algorithm)是解決任意兩點(diǎn)間的最短路徑的一種算法,可以正確處理
有向圖或負(fù)權(quán)的最短路徑問題。
Floyd-Warshall算法的時間復(fù)雜度為O(N^3),空間復(fù)雜度為O(N^2)。
Floyd-Warshall的原理是動態(tài)規(guī)劃:
設(shè)Di,j,k為從i到j(luò)的只以(1..k)集合中的節(jié)點(diǎn)為中間節(jié)點(diǎn)的最短路徑的長度。
若最短路徑經(jīng)過點(diǎn)k,則Di,j,k = Di,k,k-1 + Dk,j,k-1;
若最短路徑不經(jīng)過點(diǎn)k,則Di,j,k = Di,j,k-1。
因此,Di,j,k = min(Di,k,k-1 + Dk,j,k-1 , Di,j,k-1)。
在實際算法中,為了節(jié)約空間,可以直接在原來空間上進(jìn)行迭代,這樣空間可降至二維。
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;?
求單源、無負(fù)權(quán)的最短路。時效性較好,時間復(fù)雜度為O(V*V+E),可以用優(yōu)先隊列進(jìn)行優(yōu)化,優(yōu)化后時間復(fù)雜
度變?yōu)?(v*lgn)。
源點(diǎn)可達(dá)的話,O(V*lgV+E*lgV)=>O(E*lgV)。
當(dāng)是稀疏圖的情況時,此時E=V*V/lgV,所以算法的時間復(fù)雜度可為O(V^2) ??梢杂脙?yōu)先隊列進(jìn)行優(yōu)化,優(yōu)
化后時間復(fù)雜度變?yōu)?(v*lgn)。
Bellman-Ford
求單源最短路,可以判斷有無負(fù)權(quán)回路(若有,則不存在最短路),時效性較好,時間復(fù)雜度O(VE)。
Bellman-Ford算法是求解單源最短路徑問題的一種算法。
單源點(diǎn)的最短路徑問題是指:給定一個加權(quán)有向圖G和源點(diǎn)s,對于圖G中的任意一點(diǎn)v,求從s到v的最短路徑。
與Dijkstra算法不同的是,在Bellman-Ford算法中,邊的權(quán)值可以為負(fù)數(shù)。設(shè)想從我們可以從圖中找到一個環(huán)
路(即從v出發(fā),經(jīng)過若干個點(diǎn)之后又回到v)且這個環(huán)路中所有邊的權(quán)值之和為負(fù)。那么通過這個環(huán)路,環(huán)路
中任意兩點(diǎn)的最短路徑就可以無窮小下去。如果不處理這個負(fù)環(huán)路,程序就會永遠(yuǎn)運(yùn)行下去。 而Bellman-Ford
算法具有分辨這種負(fù)環(huán)路的能力。
SPFA
是Bellman-Ford的隊列優(yōu)化,時效性相對好,時間復(fù)雜度O(kE)。(k<<V)。
與Bellman-ford算法類似,SPFA算法采用一系列的松弛操作以得到從某一個節(jié)點(diǎn)出發(fā)到達(dá)圖中其它所有節(jié)點(diǎn)的
最短路徑。所不同的是,SPFA算法通過維護(hù)一個隊列,使得一個節(jié)點(diǎn)的當(dāng)前最短路徑被更新之后沒有必要立刻
去更新其他的節(jié)點(diǎn),從而大大減少了重復(fù)的操作次數(shù)。
SPFA算法可以用于存在負(fù)數(shù)邊權(quán)的圖,這與dijkstra算法是不同的。
與Dijkstra算法與Bellman-ford算法都不同,SPFA的算法時間效率是不穩(wěn)定的,即它對于不同的圖所需要的時
間有很大的差別。
在最好情形下,每一個節(jié)點(diǎn)都只入隊一次,則算法實際上變?yōu)閺V度優(yōu)先遍歷,其時間復(fù)雜度僅為O(E)。另一方
面,存在這樣的例子,使得每一個節(jié)點(diǎn)都被入隊(V-1)次,此時算法退化為Bellman-ford算法,其時間復(fù)雜度為
O(VE)。
SPFA算法在負(fù)邊權(quán)圖上可以完全取代Bellman-ford算法,另外在稀疏圖中也表現(xiàn)良好。但是在非負(fù)邊權(quán)圖中,
為了避免最壞情況的出現(xiàn),通常使用效率更加穩(wěn)定的Dijkstra算法,以及它的使用堆優(yōu)化的版本。通常的SPFA
算法在一類網(wǎng)格圖中的表現(xiàn)不盡如人意。
Dijkstra算法、A*算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法,本文主要介紹其中的三種。
最短路徑問題是圖論研究中的一個經(jīng)典算法問題,旨在尋找圖(由結(jié)點(diǎn)和路徑組成的)中兩結(jié)點(diǎn)之間的最短路
徑。
算法具體的形式包括:
確定起點(diǎn)的最短路徑問題:即已知起始結(jié)點(diǎn),求最短路徑的問題。
確定終點(diǎn)的最短路徑問題:與確定起點(diǎn)的問題相反,該問題是已知終結(jié)結(jié)點(diǎn),求最短路徑的問題。在無向圖中
該問題與確定起點(diǎn)的問題完全等同,在有向圖中該問題等同于把所有路徑方向反轉(zhuǎn)的確定起點(diǎn)的問題。
確定起點(diǎn)終點(diǎn)的最短路徑問題:即已知起點(diǎn)和終點(diǎn),求兩結(jié)點(diǎn)之間的最短路徑。
全局最短路徑問題:求圖中所有的最短路徑。
Floyd
求多源、無負(fù)權(quán)邊的最短路。用矩陣記錄圖。時效性較差,時間復(fù)雜度O(V^3)。
Floyd-Warshall算法(Floyd-Warshall algorithm)是解決任意兩點(diǎn)間的最短路徑的一種算法,可以正確處理
有向圖或負(fù)權(quán)的最短路徑問題。
Floyd-Warshall算法的時間復(fù)雜度為O(N^3),空間復(fù)雜度為O(N^2)。
Floyd-Warshall的原理是動態(tài)規(guī)劃:
設(shè)Di,j,k為從i到j(luò)的只以(1..k)集合中的節(jié)點(diǎn)為中間節(jié)點(diǎn)的最短路徑的長度。
若最短路徑經(jīng)過點(diǎn)k,則Di,j,k = Di,k,k-1 + Dk,j,k-1;
若最短路徑不經(jīng)過點(diǎn)k,則Di,j,k = Di,j,k-1。
因此,Di,j,k = min(Di,k,k-1 + Dk,j,k-1 , Di,j,k-1)。
在實際算法中,為了節(jié)約空間,可以直接在原來空間上進(jìn)行迭代,這樣空間可降至二維。
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表示由點(diǎn)i到點(diǎn)j的代價,當(dāng)Di,j為 ∞ 表示兩點(diǎn)之間沒有任何連接。
求單源、無負(fù)權(quán)的最短路。時效性較好,時間復(fù)雜度為O(V*V+E),可以用優(yōu)先隊列進(jìn)行優(yōu)化,優(yōu)化后時間復(fù)雜
度變?yōu)?(v*lgn)。
源點(diǎn)可達(dá)的話,O(V*lgV+E*lgV)=>O(E*lgV)。
當(dāng)是稀疏圖的情況時,此時E=V*V/lgV,所以算法的時間復(fù)雜度可為O(V^2) ??梢杂脙?yōu)先隊列進(jìn)行優(yōu)化,優(yōu)
化后時間復(fù)雜度變?yōu)?(v*lgn)。
Bellman-Ford
求單源最短路,可以判斷有無負(fù)權(quán)回路(若有,則不存在最短路),時效性較好,時間復(fù)雜度O(VE)。
Bellman-Ford算法是求解單源最短路徑問題的一種算法。
單源點(diǎn)的最短路徑問題是指:給定一個加權(quán)有向圖G和源點(diǎn)s,對于圖G中的任意一點(diǎn)v,求從s到v的最短路徑。
與Dijkstra算法不同的是,在Bellman-Ford算法中,邊的權(quán)值可以為負(fù)數(shù)。設(shè)想從我們可以從圖中找到一個環(huán)
路(即從v出發(fā),經(jīng)過若干個點(diǎn)之后又回到v)且這個環(huán)路中所有邊的權(quán)值之和為負(fù)。那么通過這個環(huán)路,環(huán)路
中任意兩點(diǎn)的最短路徑就可以無窮小下去。如果不處理這個負(fù)環(huán)路,程序就會永遠(yuǎn)運(yùn)行下去。 而Bellman-Ford
算法具有分辨這種負(fù)環(huán)路的能力。
SPFA
是Bellman-Ford的隊列優(yōu)化,時效性相對好,時間復(fù)雜度O(kE)。(k<<V)。
與Bellman-ford算法類似,SPFA算法采用一系列的松弛操作以得到從某一個節(jié)點(diǎn)出發(fā)到達(dá)圖中其它所有節(jié)點(diǎn)的
最短路徑。所不同的是,SPFA算法通過維護(hù)一個隊列,使得一個節(jié)點(diǎn)的當(dāng)前最短路徑被更新之后沒有必要立刻
去更新其他的節(jié)點(diǎn),從而大大減少了重復(fù)的操作次數(shù)。
SPFA算法可以用于存在負(fù)數(shù)邊權(quán)的圖,這與dijkstra算法是不同的。
與Dijkstra算法與Bellman-ford算法都不同,SPFA的算法時間效率是不穩(wěn)定的,即它對于不同的圖所需要的時
間有很大的差別。
在最好情形下,每一個節(jié)點(diǎn)都只入隊一次,則算法實際上變?yōu)閺V度優(yōu)先遍歷,其時間復(fù)雜度僅為O(E)。另一方
面,存在這樣的例子,使得每一個節(jié)點(diǎn)都被入隊(V-1)次,此時算法退化為Bellman-ford算法,其時間復(fù)雜度為
O(VE)。
SPFA算法在負(fù)邊權(quán)圖上可以完全取代Bellman-ford算法,另外在稀疏圖中也表現(xiàn)良好。但是在非負(fù)邊權(quán)圖中,
為了避免最壞情況的出現(xiàn),通常使用效率更加穩(wěn)定的Dijkstra算法,以及它的使用堆優(yōu)化的版本。通常的SPFA
算法在一類網(wǎng)格圖中的表現(xiàn)不盡如人意。
總結(jié)
以上是生活随笔為你收集整理的几大最短路径算法比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 凸包Graham Scan算法实现
- 下一篇: Targan 算法[有向图强连通分量]