演算法筆記 Floyed的k迴圈在最外層詳解

2022-06-04 07:09:10 字數 1199 閱讀 3271

來自某人部落格,失效了去github看

github

看不懂 floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法,與dijkstra演算法類似。該演算法名稱以創始人之一、2023年圖靈獎獲得者、史丹福大學電腦科學系教授羅伯特·弗洛伊德命名。從圖的帶權鄰接矩陣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)

知乎上有動態規劃的解釋,這裡給出通俗易懂的解釋開始演算法之前,首先介紹一下這個演算法是如何執行的,e[i][j]指的是從 i 到 j 的最短路,在初始化的時候,如果著兩條邊直接有路相連,那麼直接賦值,如果沒有連線,那麼就設為正無窮大,一般用乙個比較大的數。然後每次比較 i 和 j 之間的中間點 k ,如果 i 到k 加上 k 到 j 的權值小於 i 直接到 j 那麼 e[i][j]的值也就是 i 到 j 的最短路就變成了從e[i][k]+e[k][j]的值。

迴圈最外層證明

但是為什麼要先列舉k呢,為什麼不能先列舉 i 然後再列舉 i 的中間點k,最後列舉 j 呢,其實這是因為,i=1,j=2時,這時k分別取1,2,…,n,這時1到3,1到4,…,3到2,4到2,…的距離都不是某種意義上最短的,而這個新演算法卻直接使用了他們,並且再也沒有回頭重新計算i到j的距離是否因為其他節點間距離的改變而更短,所以這樣算出來的值也就沒有什麼意義。 

如圖

在上面這個圖中列舉i=a,j=b,然後迴圈,正確的a到b最小是3,然而你更新的是125,

因為最短那個不是只有乙個中介點,所以就沒更新

因為你在列舉下乙個i之後,就不會再次回去了,所以說a,b之間的最短路就被定為了125,以後也會以e[i][j]=125去更新其他的點,所以說,k迴圈必須放在最外層,不然會有可能無法找到最優值。

學習筆記 K 近鄰演算法

一 k 近鄰演算法概述 適用於 數值型和標量型 1 收集資料 2 準備資料 向量點距離 3 按照距離遞增次序排序 4 選取與當前距離最小的k個點 5 確定選擇k個點所在類別的頻率 6 判斷當前點的的類別 二 k 近鄰演算法實現 python語言實現 共有資料1000行,含有三個資料特徵 每年獲得的飛...

k 鄰近演算法學習筆記

目錄 採用測量不同特徵值之間的距離進行分類。缺點 適用範圍 工作原理 usr bin env python coding utf 8 from numpy import import matplotlib import matplotlib.pyplot as plt k 近鄰演算法 defclas...

C C 演算法筆記 05 迴圈結構

while 條件a 執行規則 1 如果條件a不成立,則跳過括號內語句 2 如果條件a成立,則執行括號內語句,並再次判斷條件a成立與否。dowhile 條件a 執行規則 1 首先執行括號內語句 2 判斷條件a是否成立,如果條件a不成立,結束do.while 3 如果條件a成立,則再次執行括號內語句,並...