導航:首頁 > 源碼編譯 > floyd優化演算法

floyd優化演算法

發布時間:2024-06-04 02:06:41

① Floyd演算法的演算法過程

1,從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,如果兩點之間沒有邊相連,則權為無窮大。
2,對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比已知的路徑更短。如果是更新它。
把圖用鄰接矩陣G表示出來,如果從Vi到Vj有路可達,則G[i,j]=d,d表示該路的長度;否則G[i,j]=無窮大。定義一個矩陣D用來記錄所插入點的信息,D[i,j]表示從Vi到Vj需要經過的點,初始化D[i,j]=j。把各個頂點插入圖中,比較插點後的距離與原來的距離,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值變小,則D[i,j]=k。在G中包含有兩點之間最短道路的信息,而在D中則包含了最短通路徑的信息。
比如,要尋找從V5到V1的路徑。根據D,假如D(5,1)=3則說明從V5到V1經過V3,路徑為{V5,V3,V1},如果D(5,3)=3,說明V5與V3直接相連,如果D(3,1)=1,說明V3與V1直接相連。

② floyd綆楁硶 鏄鍔ㄦ佽勫垝鐨勬濇兂鍚

1.瀹氫箟姒傝

Floyd-Warshall綆楁硶錛團loyd-Warshall algorithm錛夋槸瑙e喅浠繪剰涓ょ偣闂寸殑鏈鐭璺寰勭殑涓縐嶇畻娉曪紝鍙浠ユg『澶勭悊鏈夊悜鍥炬垨璐熸潈鐨勬渶鐭璺寰勯棶棰橈紝鍚屾椂涔熻鐢ㄤ簬璁$畻鏈夊悜鍥劇殑浼犻掗棴鍖呫侳loyd-Warshall綆楁硶鐨勬椂闂村嶆潅搴︿負O(N3)錛岀┖闂村嶆潅搴︿負O(N2)銆

2.綆楁硶鎻忚堪

1)綆楁硶鎬濇兂鍘熺悊錛

Floyd綆楁硶鏄涓涓緇忓吀鐨勫姩鎬佽勫垝綆楁硶銆傜敤閫氫織鐨勮璦鏉ユ弿榪扮殑璇濓紝棣栧厛鎴戜滑鐨勭洰鏍囨槸瀵繪壘浠庣偣i鍒扮偣j鐨勬渶鐭璺寰勩備粠鍔ㄦ佽勫垝鐨勮掑害鐪嬮棶棰橈紝鎴戜滑闇瑕佷負榪欎釜鐩鏍囬噸鏂板仛涓涓璇犻噴錛堣繖涓璇犻噴姝f槸鍔ㄦ佽勫垝鏈瀵屽壋閫犲姏鐨勭簿鍗庢墍鍦錛

浠庝換鎰忚妭鐐筰鍒頒換鎰忚妭鐐筳鐨勬渶鐭璺寰勪笉澶栦箮2縐嶅彲鑳斤紝1鏄鐩存帴浠巌鍒癹錛2鏄浠巌緇忚繃鑻ュ共涓鑺傜偣k鍒癹銆傛墍浠ワ紝鎴戜滑鍋囪綝is(i,j)涓鴻妭鐐箄鍒拌妭鐐箆鐨勬渶鐭璺寰勭殑璺濈伙紝瀵逛簬姣忎竴涓鑺傜偣k錛屾垜浠媯鏌Dis(i,k) + Dis(k,j) < Dis(i,j)鏄鍚︽垚絝嬶紝濡傛灉鎴愮珛錛岃瘉鏄庝粠i鍒発鍐嶅埌j鐨勮礬寰勬瘮i鐩存帴鍒癹鐨勮礬寰勭煭錛屾垜浠渚胯劇疆Dis(i,j) = Dis(i,k) + Dis(k,j)錛岃繖鏍蜂竴鏉ワ紝褰撴垜浠閬嶅巻瀹屾墍鏈夎妭鐐筴錛孌is(i,j)涓璁板綍鐨勪究鏄痠鍒癹鐨勬渶鐭璺寰勭殑璺濈匯

2).綆楁硶鎻忚堪錛

a.浠庝換鎰忎竴鏉″崟杈硅礬寰勫紑濮嬨傛墍鏈変袱鐐逛箣闂寸殑璺濈繪槸杈圭殑鏉冿紝濡傛灉涓ょ偣涔嬮棿娌℃湁杈圭浉榪烇紝鍒欐潈涓烘棤絀峰ぇ銆 銆銆

b.瀵逛簬姣忎竴瀵歸《鐐 u 鍜 v錛岀湅鐪嬫槸鍚﹀瓨鍦ㄤ竴涓欏剁偣 w 浣垮緱浠 u 鍒 w 鍐嶅埌 v 姣斿繁鐭ョ殑璺寰勬洿鐭銆傚傛灉鏄鏇存柊瀹冦

3).Floyd綆楁硶榪囩▼鐭╅樀鐨勮$畻----鍗佸瓧浜ゅ弶娉

鏂規硶錛氫袱鏉$嚎錛屼粠宸︿笂瑙掑紑濮嬭$畻涓鐩村埌鍙充笅瑙 濡備笅鎵紺

緇欏嚭鐭╅樀錛屽叾涓鐭╅樀A鏄閭繪帴鐭╅樀錛岃岀煩闃礟ath璁板綍u,v涓ょ偣涔嬮棿鏈鐭璺寰勬墍蹇呴』緇忚繃鐨勭偣

③ Floyd演算法是什麼

Floyd演算法又稱為弗洛伊德演算法,插點法,是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。
通過一個圖的權值矩陣求出它的每兩點間的最短路徑矩陣。
從圖的帶權鄰接矩陣A=[a(i,j)] n×n開始,遞歸地進行n次更新,即由矩陣D(0)=A,按一個公式,構造出矩陣D(1);又用同樣地公式由D(1)構造出D(2);……;最後又用同樣的公式由D(n-1)構造出矩陣D(n)。矩陣D(n)的i行j列元素便是i號頂點到j號頂點的最短路徑長度,稱D(n)為圖的距離矩陣,同時還可引入一個後繼節點矩陣path來記錄兩點間的最短路徑。
採用的是(鬆弛技術),對在i和j之間的所有其他點進行一次鬆弛。所以時間復雜度為O(n^3); 其狀態轉移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]} map[i,j]表示i到j的最短距離 K是窮舉i,j的斷點 map[n,n]初值應該為0,或者按照題目意思來做。
當然,如果這條路沒有通的話,還必須特殊處理,比如沒有map[i,k]這條路

④ 銆愬師鍒涖戠畻娉曠郴鍒椻斺斿洓縐嶆渶鐭璺綆楁硶錛欶loyd錛孌ijkstra錛孊ellman-Ford錛孲PFA

綆楁硶涔嬫棶錛氭帰緔㈠洓縐嶇粡鍏告渶鐭璺寰勭畻娉


鍦ㄨ$畻鏈虹戝︾殑榪峰涓錛屾渶鐭璺寰勭畻娉曠姽濡傜拃鐠ㄧ殑鏄熻景錛岀収浜浜嗙綉緇滈氫俊鐨勮礬寰勩傛湰鏂囧皢甯﹂嗕綘娣卞叆鐞嗚ВFloyd-Warshall銆丏ijkstra銆丅ellman-Ford鍜孲PFA榪欏洓浣嶇畻娉曟槑鏄燂紝瀹冧滑鍚勮嚜浠ョ嫭鐗圭殑欖呭姏鍦ㄥ浘璁洪嗗煙闂鑰銆傝╂垜浠涓璧鋒彮寮瀹冧滑鐨勯潰綰憋紝鎰熷彈瀹冧滑鐨勫閥濡欎笌濞佸姏銆

棣栧厛錛屾垜浠鏉ュ埌Floyd-Warshall鐨勬垮爞錛岃繖鏄涓鍦哄姩鎬佽勫垝鐨勭洓瀹淬傚畠鐨勪唬鐮佷紭闆呬笖綆媧侊紝閫氳繃涓夊眰寰鐜瀹炵幇浜嗗氭簮鏈鐭璺寰勭殑鏌ユ壘錛屽叾鐘舵佽漿縐繪柟紼嬪疀濡備竴棣栦紭緹庣殑鏁板﹁瘲綃囷細f[i][j] = min(f[i][j], f[i][k] + f[k][j])銆傝繖涓綆楁硶閫傜敤浜庢棤璐熸潈鐜錛屼絾絀洪棿闇奼傝緝楂橈紝涓篛(n^2)銆傞氳繃婊氬姩鏁扮粍鐨勬妧宸э紝鎴戜滑鍙浠ヨ繘涓姝ヤ紭鍖栫┖闂存晥鐜囷紝璁╃畻娉曟洿鍔犺交鐩堛

鎺ヤ笅鏉ワ紝鎴戜滑杞鍚慏ijkstra鐨勮垶鍙幫紝榪欎綅璐蹇冪瓥鐣ョ殑寮曢嗚呫傚畠涓撴敞浜庡崟婧愭渶鐭璺寰勶紝瀵硅竟鐨勬潈閲嶆湁鐫涓ユ牸鐨勯潪璐熻佹眰銆侱ijkstra閫氳繃浼樺厛闃熷垪錛堝傚皬鏍瑰爢鎴栨枑娉㈤偅濂戝爢錛夌殑宸у欒繍鐢錛屽皢鏃墮棿澶嶆潅搴﹂檷浣庡埌O((E+n)lgn)錛屽湪紼鐤忓浘涓琛ㄧ幇鍑鴻壊銆傚叾鏍稿績鎿嶄綔錛屽傛彃鍏ュ拰鑾峰彇鏈灝忓礆紝浣撶幇浜嗗爢鐨勯珮鏁堟с

鐒跺悗錛屾垜浠闈㈠圭殑鏄疊ellman-Ford鍜孲PFA榪欏歸毦鍏勯毦寮熴侭ellman-Ford浠ュ叾鏃犵晱鐨勫媷姘旓紝鎺ョ撼浜嗚礋鏉冭竟鍜岀幆鐨勬寫鎴橈紝閫氳繃ne嬈℃澗寮涙搷浣滅『淇濈粨鏋滅殑鍑嗙『鎬с傝孲PFA錛屼綔涓築ellman-Ford鐨勪紭鍖栫増鏈錛岄氳繃闃熷垪絳栫暐閬垮厤浜嗕笉蹇呰佺殑鏉懼紱錛屾椂闂村嶆潅搴﹂氬父琚璁や負鎺ヨ繎O(e)銆備絾闇娉ㄦ剰錛孲PFA鍦ㄧ壒瀹氭暟鎹涓嬪彲鑳藉彉寰椾笉紼沖畾錛孌ijkstra浠嶆槸棣栭夈

鍦ㄦ瘡涓綆楁硶鐨勬帰緔涓錛屾垜浠閮界湅鍒頒簡鏁板︾殑涓ヨ皚涓庝唬鐮佺殑鐏靛閥浜ょ粐銆傚畠浠鍚勮嚜鍦ㄥ勭悊涓嶅悓鍦烘櫙鏃跺睍鐜板嚭鐙鐗圭殑浠峰箋傝╂垜浠緇х畫娣卞叆瀛︿範錛岀悊瑙e畠浠鑳屽悗鐨勭悊璁哄拰瀹為檯搴旂敤錛岃╂渶鐭璺寰勭畻娉曞湪璁$畻鏈虹戝︾殑鑸炲彴涓婃紨緇庢洿綺懼僵鐨勭瘒絝犮

璇風暀鎰忥紝鏂愭嘗閭e戝爢鐨勪紭鍖栦細鍦ㄥ悗緇絝犺妭涓涓轟綘鎻紺烘洿娣卞眰嬈$殑綆楁硶涔嬬編銆傛劅璋浣犵殑鍏蟲敞錛屾湡寰呬綘鐨勫弬涓庡拰鎸囨o紝璁╂垜浠涓璧峰湪榪欐潯綆楁硶涔嬫棶涓婂叡鍚岃繘姝ワ紒

⑤ Floyd演算法的優缺點分析

Floyd演算法適用於APSP(All Pairs Shortest Paths,多源最短路徑),是一種動態規劃演算法,稠密圖效果最佳,邊權可正可負。此演算法簡單有效,由於三重循環結構緊湊,對於稠密圖,效率要高於執行|V|次Dijkstra演算法,也要高於執行V次SPFA演算法。
優點:容易理解,可以算出任意兩個節點之間的最短距離,代碼編寫簡單。
缺點:時間復雜度比較高,不適合計算大量數據。

⑥ 最短路徑演算法

最短路徑的演算法主要有三種:floyd演算法、Dijkstra演算法、Bellman-Ford(貝爾曼-福特)

一、floyd演算法

基本思想如下:從任意節點A到任意節點B的最短路徑不外乎2種可能,1是直接從A到B,2是從A經過若干個節點X到B。所以,我們假設Dis(AB)為節點A到節點B的最短路徑的距離,對於每一個節點X,我們檢查Dis(AX) + Dis(XB) < Dis(AB)是否成立,如果成立,證明從A到X再到B的路徑比A直接到B的路徑短,我們便設置Dis(AB) = Dis(AX) + Dis(XB),這樣一來,當我們遍歷完所有節點X,Dis(AB)中記錄的便是A到B的最短路徑的距離。

三、Bellman-Ford(貝爾曼-福特)

演算法的流程如下:

給定圖G(V, E)(其中V、E分別為圖G的頂點集與邊集),源點s,

1.數組Distant[i]記錄從源點s到頂點i的路徑長度,初始化數組Distant[n]為, Distant[s]為0;

2.以下操作循環執行至多n-1次,n為頂點數:
對於每一條邊e(u, v),如果Distant[u] + w(u, v) < Distant[v],則另Distant[v] = Distant[u]+w(u, v)。w(u, v)為邊e(u,v)的權值;
若上述操作沒有對Distant進行更新,說明最短路徑已經查找完畢,或者部分點不可達,跳出循環。否則執行下次循環;

3.為了檢測圖中是否存在負環路,即權值之和小於0的環路。對於每一條邊e(u, v),如果存在Distant[u] + w(u, v) < Distant[v]的邊,則圖中存在負環路,即是說該圖無法求出單源最短路徑。否則數組Distant[n]中記錄的就是源點s到各頂點的最短路徑長度。

可知,Bellman-Ford演算法尋找單源最短路徑的時間復雜度為O(V*E).

⑦ floyd演算法能不能保證有最優解

Floyd演算法又稱為弗洛伊德演算法,插點法,是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。

演算法過程:

把圖用鄰接距陣G表示出來,如果從Vi到Vj有路可達,則G[i,j]=d,d表示該路的長度;否則G[i,j]=空值。

定義一個距陣D用來記錄所插入點的信息,D[i,j]表示從Vi到Vj需要經過的點,初始化D[i,j]=j。
把各個頂點插入圖中,比較插點後的距離與原來的距離,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值變小,則D[i,j]=k。

在G中包含有兩點之間最短道路的信息,而在D中則包含了最短通路徑的信息。
比如,要尋找從V5到V1的路徑。根據D,假如D(5,1)=3則說明從V5到V1經過V3,路徑為{V5,V3,V1},如果D(5,3)=3,說明V5與V3直接相連,如果D(3,1)=1,說明V3與V1直接相連。

閱讀全文

與floyd優化演算法相關的資料

熱點內容
手機文件壓縮出錯 瀏覽:516
如何登錄毒app 瀏覽:834
汽車中控台加密 瀏覽:862
海南農村信用社app如何開通簡訊 瀏覽:809
phpdns緩存 瀏覽:415
ipad騰訊視頻app如何播放本地視頻 瀏覽:990
蝦米伺服器關閉如何找到以前的歌 瀏覽:18
php自動建站 瀏覽:475
命令與征服3游俠網 瀏覽:970
騰訊雲買哪個地區伺服器 瀏覽:249
香港哪裡有app賣內地零食 瀏覽:683
編譯內核找不到工具鏈 瀏覽:453
java常見模式 瀏覽:504
典欣空調壓縮機 瀏覽:425
app如何認定許可權 瀏覽:853
兩個復數相除的角度計演算法則 瀏覽:590
電商類app開發怎麼收費 瀏覽:304
打造電子書反編譯工具 瀏覽:79
壓縮比115 瀏覽:562
pdf怎麼摳圖 瀏覽:870