網上有很多floyd演算法,但我太笨了,沒有幾篇文章能讓我看明白flody演算法的原理的,說實話floyd演算法實現很簡單嘛,就三個for迴圈就能搞定,核心**也只有5,6行的樣子。
我相信看這篇文章之前,大家已經看過很多有關flody的演算法。最近做實驗又涉及到floyd演算法,花時間去琢磨,大致明白了。
講的不專業,見諒。
設乙個n階矩陣,用二維數值a[n+1][n+1]表示
下面是核心演算法:
for(k=1;k<=n;k++)
for(i =1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j] = min(a[i][j],a[i][k]+[k][j]);
在二維數值中,求在兩個點(i,j)之間求最短路徑,求解的方法無非是,比較兩點直接可以到達的距離即a[i][j],和通過(在起點通過乙個間接點到終點)這種間接到達終點的方式的距離即a[i][k]+a[k][j] (k屬於[1,n],k為整數),尋找這些路徑中的最短路徑。即若通過的路徑比原來的路徑短,則更新路徑長度。
假設此時n=5.
首先整個問題有最優子結構性質,若= +++,那麼其中的,,,必須也是最優的。
我覺得弄不明白的同學應該有這麼一種疑惑,若= +,如何確定此時的和已經到達最小了呢?最外面一層for迴圈有什麼作用呢?
最外面的for迴圈的第乙個作用,讓我們實現比較間接距離a[i][k]+a[k][j]和直接距離a[i][j]的大小,確定兩種距離中的最小距離。
最外面的for迴圈的第二個作用,還是以上面的例子,當k=1時,若= +,當k=2,若再求min()時,再計算+,此時的和可能已經被更新了。即可能=+,可能=+(因為經過了k=1的情況),假設此時的=+則=++,每當k++時,矩陣中每個點都可能進行更新,即插入新的點,當k=n,即k=5時,而此時每個點之間的路徑最多可以插入了n-1個點,即4個點,也可以說成插入4條邊,則我們可以考慮到若v2要經過所有點才能到達v5時,假設=+++此時只需要插入兩條邊即可。4>2所以包含了要插入所有邊和點的情況。事實上也不可能出現出現插入3條邊或4條邊的情況,因為這樣必定會出現環,從某個點出發又回到某個點,但是路徑中有環是不可能出現的(因為=0小於等於)
大家還有可能有這樣的擔心,這樣的情況發生=+,=+,兩個式子會產生相互的影響。其實這種情況是不可能出現的,因為出現了環。把其中乙個式子帶入另乙個式子,而顯然小於++,所以這種情況不可能出現。
iOSer你真的需要演算法麼?
int i,j,temp int a int length sizeof a sizeof a 0 for j 0 j length j for i 0 i length i printf n 複製 然後看一波我們熟悉的oc版 nsmutablearray p nsmutablearray allo...
閒著沒事?你可以這樣學學演算法
對於很多碼農來說,演算法總是顯得有那麼一點高深莫測,好像是一道難以跨越的坎。造成這種現象的原因,一是因為我們對演算法的了解和對自己能力的了解不夠,還沒入門就被嚇退了,另外乙個原因是,大部分人實際工作中很少用到演算法,很多演算法都已經被封裝到函式庫或介面裡面了,只需要呼叫就行,而為了能早點完成任務,我...
有了它,AI甚至可以讓你知道對方是否真的愛你?
你到底愛不愛我?這或許是戀愛雙方出現頻率最高的問題,想要知道對方大腦在想什麼,並不是什麼天方夜譚,通過科學技術還真的有望實現。不過,讓如此大膽的想法變為現實,我們需要借助什麼技術呢?我想,目前最火的人工智慧技術應該首先出列。人工智慧風頭正勁 卻逃不過 博眼球 的帽子 人工智慧並不是什麼新鮮的概念,但...