日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较

發(fā)布時間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
??? 幾大最短路徑算法比較

?轉(zhuǎn)自:http://blog.csdn.net/v_july_v/article/details/6181485

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

?????? 求多源、無負權(quán)邊的最短路。用矩陣記錄圖。時效性較差,時間復雜度O(V^3)。
???????Floyd-Warshall算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種算法,可以正確處理有向圖或負權(quán)的最短路徑問題。

Floyd-Warshall算法的時間復雜度為O(N^3),空間復雜度為O(N^2)。

????? Floyd-Warshall的原理是動態(tài)規(guī)劃:
設(shè)Di,j,k為從i到j(luò)的只以(1..k)集合中的節(jié)點為中間節(jié)點的最短路徑的長度。
若最短路徑經(jīng)過點k,則Di,j,k = Di,k,k-1 + Dk,j,k-1;
若最短路徑不經(jīng)過點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é)約空間,可以直接在原來空間上進行迭代,這樣空間可降至二維。
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

????? 求單源、無負權(quán)的最短路。時效性較好,時間復雜度為O(V*V+E)。
源點可達的話,O(V*lgV+E*lgV)=>O(E*lgV)。
????? 當是稀疏圖的情況時,此時E=V*V/lgV,所以算法的時間復雜度可為O(V^2) 。若是斐波那契堆作優(yōu)先隊列的話,算法時間復雜度,則為O(V*lgV + E)。

????? 更多,請參考:二(續(xù))、徹底理解Dijkstra算法,及二(再續(xù))、Dijkstra 算法+fibonacci堆的逐步c實現(xiàn)

?

Bellman-Ford

????? 求單源最短路,可以判斷有無負權(quán)回路(若有,則不存在最短路),
時效性較好,時間復雜度O(VE)。此算法日后還會在本BLOG內(nèi)具體闡述

Bellman-Ford算法是求解單源最短路徑問題的一種算法。

????? 單源點的最短路徑問題是指:
給定一個加權(quán)有向圖G和源點s,對于圖G中的任意一點v,求從s到v的最短路徑。

????? 與Dijkstra算法不同的是,在Bellman-Ford算法中,邊的權(quán)值可以為負數(shù)。
????? 設(shè)想從我們可以從圖中找到一個環(huán)路(即從v出發(fā),經(jīng)過若干個點之后又回到v)且這個環(huán)路中所有邊的權(quán)值之和為負。那么通過這個環(huán)路,環(huán)路中任意兩點的最短路徑就可以無窮小下去。如果不處理這個負環(huán)路,程序就會永遠運行下去。 而Bellman-Ford算法具有分辨這種負環(huán)路的能力。


SPFA

????? 是Bellman-Ford的隊列優(yōu)化,時效性相對好,時間復雜度O(kE)。(k<<V)。

與Bellman-ford算法類似,SPFA算法采用一系列的松弛操作以得到從某一個節(jié)點出發(fā)到達圖中其它所有節(jié)點的最短路徑。所不同的是,SPFA算法通過維護一個隊列,使得一個節(jié)點的當前最短路徑被更新之后沒有必要立刻去更新其他的節(jié)點,從而大大減少了重復的操作次數(shù)。

????? SPFA算法可以用于存在負數(shù)邊權(quán)的圖,這與dijkstra算法是不同的。

與Dijkstra算法與Bellman-ford算法不同,SPFA的算法時間效率是不穩(wěn)定的,即它對于不同的圖所需要的時間有很大的差別。

????? 在最好情形下,每一個節(jié)點都只入隊一次,則算法實際上變?yōu)閺V度優(yōu)先遍歷,其時間復雜度僅為O(E)。另一方面,存在這樣的例子,使得每一個節(jié)點都被入隊(V-1)次,此時算法退化為Bellman-ford算法,其時間復雜度為O(VE)。

????? SPFA算法在負邊權(quán)圖上可以完全取代Bellman-ford算法,另外在稀疏圖中也表現(xiàn)良好。但是在非負邊權(quán)圖中,為了避免最壞情況的出現(xiàn),通常使用效率更加穩(wěn)定的Dijkstra算法,以及它的使用堆優(yōu)化的版本。通常的SPFA算法在一類網(wǎng)格圖中的表現(xiàn)不盡如人意。

完。

轉(zhuǎn)載于:https://www.cnblogs.com/AndyDai/p/4734120.html

總結(jié)

以上是生活随笔為你收集整理的几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。