跳至內容

Floyd-Warshall演算法

出自Taiwan Tongues 台語維基
於 2025年8月23日 (六) 11:53 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

Floyd-Warshall 演算法(英語:Floyd-Warshall algorithm), 中文亦稱枋洛他德演算法抑是佛洛依德演算法,是解決任意兩點間的上短路徑的一種演算法,會當正確處理有向圖負權(毋過袂當存在負權迴路)的上短路徑問題,同時嘛予人用佇計算有向圖的遞移閉包。

Floyd-Warshall 演算法的時間複雜度做 $ O ( | V | ^ { 三 } ) $,空間複雜度做 $ O ( | V | ^ { 二 } ) $,其中 $ V $ 是點集。

原理

Floyd-Warshall 演算法的原理是動態的規劃。

設 $ D _ { i , j , k } $ 為對 $ i $ 到 $ j $ 的干焦以 $ ( 一 . . k ) $ 集合中的節點為中央節點的上短路徑的長度。

一 . 若上短路徑經過點 k,著 $ D _ { i , j , k }=D _ { i , k , k 影一 } + D _ { k , j , k 影一 } $; 二 . 若上短路徑不經過點 k,著 $ D _ { i , j , k }=D _ { i , j , k 影一 } $。

所以,$ D _ { i , j , k }={ \ mbox { min } } ( D _ { i , j , k 影一 } , D _ { i , k , k 影一 } + D _ { k , j , k 影一 } ) $。

佇實際演算法內底,為著儉約空間,會使直接佇咧原來空間迵天,按呢空間會當降到二維。

演算法描述

Floyd-Warshall 演算法的虛擬碼是描述如下:

` ` ` 一letdist be a | V | × | V | array of minimum distances initialized to ∞ ( infinity ) 二for eachvertex _ v _ 三 dist [_ v _] [_ v _] ← 零四for eachedge ( _ u _ , _ v _ ) 五 dist [_ u _] [_ v _] ← w ( _ u _ , _ v _ ) _ / / the weight of the edge ( _ u _ , _ v _ ) _ 六for_ k _fromto| V | 七for_ i _fromto| V | 八for_ j _fromto| V | 九ifdist [_ i _] [_ j _] > dist [_ i _] [_ k _] + dist [_ k _] [_ j _] 十 dist [_ i _] [_ j _] ← dist [_ i _] [_ k _] + dist [_ k _] [_ j _] 十一end if ` ` `

其中 ` dist [i] [j] ` 表示因為點 $ i $ 到矣 $ j $ 的代價,當其實 ∞ 表示兩點之間無任何連接。

使用動態規劃的演算法

  • 上長公共子序列
  • Viterbi 演算法

實現

Floyd 演算法佇無仝的程式語言中均有大量的實現方法:

  • C + +:boost : : graph 庫下
  • C #:QuickGraph 和 QuickGraphPCL 中均有相關實現方法
  • Java:Apache Commons Graph 庫中
  • JavaScript:Cytoscape 庫中
  • MATLAB:Matlab \ _ bgl 包著
  • Perl:Graph 組件下
  • Python:SciPy 庫下(scipy . sparse . csgraph), NetworkX 庫中嘛有
  • R:e 一千空七十一和 Rfast 揹仔內

參考來源

參見

  • 圖論上短路
  • Dijkstra 演算法
  • Bellman-Ford 演算法