深入理解floyd演算法

2021-10-03 13:46:05 字數 1288 閱讀 3600

先上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]有關 然後我們可以根據這個性質解決很多問題

for

(k =

1; k <= n; k++)}

}}

這個經典**的難點在於理解為什麼k的迴圈在外面,這裡附上一波知乎的高讚解釋

可能部分大佬看到這段抽象的解釋之後已經豁然開朗,如果還有部分大佬沒有看懂的話,本菜雞嘗試用通俗的語言來翻譯一下

這裡給出一張簡單的有向圖

dist[1][3]的距離無法更新,因為dist[1][3] = dist[1][6] + dist[6][3],

而dist[1][6] = dist[1][5]+dist[5][6]

即先要更新dist[1][6]之後,才能再更新dist[1][3],而由於i,j在外側

對於dist[1][3] 的訪問先於對於dist[1][6]的訪問,所以要更新dist[1][3]時,dist[1][6]還是不可達狀態,也就是動態規劃中的前面狀態未達到最優狀態就進行後續的動態規劃

k = 6時,dist[1][6] = 2,dist[6][3] = 1,所以dist[1][3] = 3,更新dist[1][3]

如果 5與6的位置倒過來,如圖所示

先更新以5為中點的最優值,得到dist[6][3],再更新以6為重點的最優值,得到dist[1][3]

深入理解Floyd演算法思路

floyd演算法經典 只有5行 或者也可以寫成4行 思路聽起來也那麼 顯然 但大部分人對floyd演算法的理解僅僅限於它的實現是三層迴圈,k在最外層,i和j在內層不分順序,用路徑鬆弛來更新最短路徑。但其實大多數人都沒有弄清楚乙個問題,為什麼外層迴圈是遍歷k,而不是把k放到最內層呢,只是知道放在裡邊就...

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是平滑的....