日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

算法笔记----Floyed的k循环在最外层详解

發(fā)布時(shí)間:2024/6/21 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 算法笔记----Floyed的k循环在最外层详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

來(lái)自某人博客,失效了去github看
github

看不懂 Floyd算法又稱為插點(diǎn)法,是一種利用動(dòng)態(tài)規(guī)劃的思想尋找給定的加權(quán)圖中多源點(diǎn)之間最短路徑的算法,與Dijkstra算法類似。該算法名稱以創(chuàng)始人之一、1978年圖靈獎(jiǎng)獲得者、斯坦福大學(xué)計(jì)算機(jī)科學(xué)系教授羅伯特·弗洛伊德命名。從圖的帶權(quán)鄰接矩陣A=[a(i,j)] n×n開(kāi)始,遞歸地進(jìn)行n次更新,即由矩陣D(0)=A,按一個(gè)公式,構(gòu)造出矩陣D(1);又用同樣地公式由D(1)構(gòu)造出D(2);……;最后又用同樣的公式由D(n-1)構(gòu)造出矩陣D(n)。矩陣D(n)的i行j列元素便是i號(hào)頂點(diǎn)到j(luò)號(hào)頂點(diǎn)的最短路徑長(zhǎng)度,稱D(n)為圖的距離矩陣,同時(shí)還可引入一個(gè)后繼節(jié)點(diǎn)矩陣path來(lái)記錄兩點(diǎn)間的最短路徑。采用松弛技術(shù)(松弛操作),對(duì)在i和j之間的所有其他點(diǎn)進(jìn)行一次松弛。所以時(shí)間復(fù)雜度為O(n^3)


知乎上有動(dòng)態(tài)規(guī)劃的解釋,這里給出通俗易懂的解釋


開(kāi)始算法之前,首先介紹一下這個(gè)算法是如何運(yùn)行的,e[i][j]指的是從 i 到 j 的最短路,在初始化的時(shí)候,如果著兩條邊直接有路相連,那么直接賦值,如果沒(méi)有連接,那么就設(shè)為正無(wú)窮大,一般用一個(gè)比較大的數(shù)。然后每次比較 i 和 j 之間的中間點(diǎn) k ,如果 i 到k 加上 k 到 j 的權(quán)值小于 i 直接到 j 那么 e[i][j]的值也就是 i 到 j 的最短路就變成了從e[i][k]+e[k][j]的值。

循環(huán)最外層證明

但是為什么要先枚舉k呢,為什么不能先枚舉 i 然后再枚舉 i 的中間點(diǎn)k,最后枚舉 j 呢,其實(shí)這是因?yàn)椋琲=1,j=2時(shí),這時(shí)k分別取1,2,…,n,這時(shí)1到3,1到4,…,3到2,4到2,…的距離都不是某種意義上最短的,而這個(gè)新算法卻直接使用了他們,并且再也沒(méi)有回頭重新計(jì)算i到j(luò)的距離是否因?yàn)槠渌?jié)點(diǎn)間距離的改變而更短,所以這樣算出來(lái)的值也就沒(méi)有什么意義。

如圖

在上面這個(gè)圖中枚舉i=A,j=B,然后循環(huán),正確的A到B最小是3,然而你更新的是125,

因?yàn)樽疃棠莻€(gè)不是只有一個(gè)中介點(diǎn),所以就沒(méi)更新

因?yàn)槟阍诿杜e下一個(gè)i之后,就不會(huì)再次回去了,所以說(shuō)A,B之間的最短路就被定為了125,以后也會(huì)以e[i][j]=125去更新其他的點(diǎn),所以說(shuō),k循環(huán)必須放在最外層,不然會(huì)有可能無(wú)法找到最優(yōu)值。





種一棵樹(shù)最好的時(shí)間是十年前,其次是現(xiàn)在。

總結(jié)

以上是生活随笔為你收集整理的算法笔记----Floyed的k循环在最外层详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。