深入理解Floyd演算法思路

2021-09-25 14:08:36 字數 701 閱讀 8168

** 

floyd演算法經典**只有5行(或者也可以寫成4行),思路聽起來也那麼「顯然」。

但大部分人對floyd演算法的理解僅僅限於它的實現是三層迴圈,k在最外層,i和j在內層不分順序,用路徑鬆弛來更新最短路徑。但其實大多數人都沒有弄清楚乙個問題,為什麼外層迴圈是遍歷k,而不是把k放到最內層呢,只是知道放在裡邊就不對了。當然,也有不少部落格解釋這個問題,但寫的大多有些複雜,下面是我個人的理解。

首先,它是運用了動態規劃的思想來進行問題求解。動態規劃解題的關鍵在於找好子結構。floyd構造的結構非常巧妙:找i和j之間通過編號不超過k(k從1到n)的節點的最短路徑(一定要注意,這裡是當前最短路徑,當k=n時達到最終最短路徑)。為了便於說明,我們可以弄乙個三維陣列f[k][i][j]表示i和j之間可以通過編號不超過k的節點的「最短路徑」。對於k-1到k,只有兩種可能,經過編號為k的點,要麼不能找到一條從i到j的更短路,此時有f[k][i][j] = f[k-1][i][j] ;要麼能找到,那這個最短路徑一定是d[i][k]+d[k][j],那麼就用這個較小的距離去更新d[i][j]。綜合以上兩種情況,f[k][i][j] = min(f[k-1][i][j] , f[k-1][i][k]+f[k-1][k][j])。

具體實現就比較簡單了,對任意兩點間的距離,我們初始化他們為無窮大(這裡無窮大是一種形象的說法),然後用鬆弛技術進行距離的更新。然後用三層迴圈的話,最外層空間就可以省下來了,因為f[k]只與f[k-1]有關。

深入理解floyd演算法

先上floyd演算法的 本質上是動態規劃問題 本質就是dp含有動態規劃的思想,滿足重疊子問題和最優子結構 dis k i j min dis k 1 i j dis k 1 i k dis k 1 k j 我們可以發現他其實是由前k 1的狀態來推出第k個點的狀態之後你就會發現f k 只與f k 1 ...

KMP演算法深入理解

knuth morris pratt演算法 簡稱kmp 是最常用字元傳匹配演算法之一。它以三個發明者命名,起頭的那個k就是著名科學家donald knuth。kmp演算法對於任何模式和目標序列,都可以在 線性時間 內完成匹配查詢,而不會發生退化。1 kmp演算法的原理 kmp演算法中主要的概念是ne...

深入理解KNN演算法

1.knn是個 消極 演算法,y f x1,x2,xp,x 其中x1,x2,xp是訓練資料,x是待分類或回歸查詢例項,y是分類或回歸結果.整個過程中沒有建立任何數學模型.2.與 積極 演算法的乙個關鍵差異 knn可以為不同的待分類查詢例項建立不同的目標函式逼近.3.knn的唯一假設,函式f是平滑的....