dijkstra演算法用於圖中計算最小路徑,在路由選擇中也有用到。以乙個圖為例:
演算法執行過程:
1、選擇乙個起始點,並初始化其他各個點到起始點的開銷表d以及相對應的上乙個點(初始化時就是起點)。
2、 找到開銷表d中的最小值,選擇這個開銷表的最小值所對應的點作為下乙個節點,記作p,並更新其他未經過的點n到這個點p的開銷表d,其中開銷表d的數值更新為當前開銷表的數值d( n )與當前到這個節點p的開銷表的數值d( p )加上p點到當前點的開銷路徑值的最小值。即:
d(n)=min(d(n),d( p)+c(p,n))
並記下這個最小值所指向的上乙個節點,若當前開銷表的數值d( p)為最小值,則選擇當前d( p)指向的節點(第一次迴圈時指向的時起始點)。
ps:c ( n , p )記為p點到當前點n的開銷路徑值。
3、迴圈第二步,直到遍歷完所有的節點。
1、首先選擇u作為起點,其他各個點到u的開銷表為:
已加入節點
d(x)
d(v)
d(w)
d(y)
d(z)
u1,u
2,u5,u∞∞
**裡的數字為開銷表的數值,字母為指向的上乙個節點。
2、選擇開銷表中的最小值作為下乙個節點,這裡可以看到d(x)=1是最小的,因此選擇x作為下乙個節點,然後更新其他未經過的點,即y、z、w、v的開銷表。各個點的更新過程如下:
對於v: d(v)=2, d(x)+c(x,v)=1+2=3,將d(v)更新為原來的d(v),仍然指向u。
對於y: d(y)=∞, d(x)+c(x,y)=1+1=2,因此更新將d(y)更新為2, 指向x。
對於w: d(w)=5, d(x)+c(x,w)=1+3=4,因此將d(w)更新為4, 指向x。
對於z: d(z)=∞,d(x)+c(x,z)=∞,d(z)仍為∞,此時不指向u也不指向x,因為是無窮意味著z到x和u都沒有路徑。
更新完後的開銷表為:
已加入節點
d(x)
d(v)
d(w)
d(y)
d(z)
ux2,u
4,x2,x
∞3、繼續迴圈,可以看到上面的表中最小值為d(y)和d(v),這裡選擇y作為下乙個節點。
對於v: d(v)=
對於w:d(w)=4, d(y)+c(y,w)=3,更新d(w)為3,指向y。
對於z: d(z)=∞,d(y)+c(y,z)=4,更新為4,指向y。
更新完後的開銷表為:
已加入節點
d(x)
d(v)
d(w)
d(y)
d(z)
uxy2,u
3,y4,y
4、繼續迴圈,選擇v作為下一次節點,更新開銷表。
對於w:d(w)=3, d(v)+c(v,w)=2+3=5,更新為3,仍然指向y。
對於z:d(z)=4,d(v)+c(v,z)=∞,更新為4,仍然指向y。
更新後的開銷表為:
已加入節點
d(x)
d(v)
d(w)
d(y)
d(z)
uxyv
3,y4,y
5、繼續迴圈,選擇w作為下一次節點,更新開銷表。
對於z: d(z)=4, d(w)+c(w,z)=3+5=8,更新為4,仍然指向y。
更新後的選擇表為:
已加入節點
d(x)
d(v)
d(w)
d(y)
d(z)
uxyvw
4,y6、繼續迴圈,開銷表中只剩下z乙個數值了,選擇z作為下乙個節點,將z記作已加入的節點。
總結:
dijkstra演算法看似複雜,實際上其核心要點在更新開銷表時的比較動作,以第三步中的對於w點為例來說明:
對於w:d(w)=4, d(y)+c(y,w)=3,更新d(w)為3,指向y。d(w)=4為從起點u→x→w的路徑值,而 d(y)+c(y,w)=3則為從起點u→x→y→w的路徑值。
這裡的兩者比較說明從起點u到w,經過後面這條路徑更短一些,所以選擇後面這條路徑作為到w點的最小路徑。因此開銷表記錄的就是起點到各個點的最小路徑值。經過迴圈完所有的點,就可以得到起點到各個點的最小路徑。
資料結構 Dijkstra演算法
在了解 dijkstra演算法 之前,要先了解一下路徑的問題 路徑 考慮帶權有向圖,把一條路徑 僅僅考慮簡單路徑 上所經邊的權值之和定義為該路徑的路徑長度或稱帶權路徑長度。最短路徑 從源點到終點可能不止一條路徑,把路徑長度最短的那條路徑稱為最短路徑。從乙個頂點到其餘各頂點的最短路徑 問題描述 給定乙...
資料結構 最短路徑 Dijkstra演算法
最短路徑 dijkstra演算法 設計實現有向網,針對隨機有向網例項和隨機源點,用dijkstra演算法求解出單源點到其他各頂點的最短路徑。給出求解過程的動態演示。可考慮實現不用儲存結構上的實現。如下圖所示,若要建立乙個這樣的圖,且源點為1時,則輸入順序為 include include defin...
資料結構與演算法 演算法 演算法和資料結構
資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...