迪傑斯特拉算法解析


一.理論基礎

迪傑斯特拉算法(下文簡稱DJ算法)是理論基礎是一條簡單的定理:

下一條最短路徑或者是弧(V0, Vx),或者是中間經過S中的某些頂點,而后到達Vx的路徑。(S是最短路徑已知的頂點集合)

(為了准確的描述定理,這里就直接摘抄了。。至於它對不對,嗯,據說反證法可證之)很明顯這是一個遞推算法:反復求下一條,直至沒有下一條為止。

二.問題分析

現有加權有向圖如下:

求從V0出發,到達其它各個頂點的最短路徑。

首先為了把它轉換成便於描述的數學形式,得寫出對應的鄰接矩陣(x表示不可達):

0 50 10 x 45 x
x 0 15 x 10 x
20 x 0 15 x x
x 20 x 0 35 x
x x x 30 0 x
x x x 3 x 0

分析定理可以得出:目前S集合中只有1個頂點:V0(V0到自身的肯定是最短路徑),除了S集合這個輔助空間外,我們還需要:

  • V集合:最短路徑未知的頂點組成的集合,即S集合的補集
  • path[]:記錄最短路徑,用來顯示結果
  • dist[]:記錄路徑長度,作用同上
  • Vx:記錄下一個頂點

准備工作結束,可以開始求解了

三.求解過程

0.初始狀態

dist[]初始化為V0到各個頂點的直接距離(x表示不可直達),path[]初始化為對應的路徑,不可直達的記作NULL,選取V集合中dist值最小的頂點V2作為下一個頂點(定理中的Vx)

1.第1步

把V2加入S集合,我們多了一個中轉站V2,接下來更新dist[],看借助V2中轉的話是不是更短,根據計算結果更新dist[]和path[],把更短的路徑長度和對應路徑放進去,V集合中dist值最小的V3作為下一個頂點

2.第2-5步

繼續選取下一個頂點,直至V集合中沒有可選頂點為止

四.總結

DJ算法過程非常簡單:

  1. 確定S中的第一個點(也就是源點V0);
  2. 根據定理遞推(一直找最短,並試圖借助最短中轉)

算法思路本身不難,當初看不明白是因為被具體的偽代碼實現繞進去了,所以學習算法應該關注思路而不是具體實現,尤其是偽代碼算法,通常會隨意聲明一些奇怪的數據結構,卻不解釋為什么需要這些輔助空間,比如本例中,S集合和V集合只需要有一個即可,path[]和dist[]也可以用結構體清晰的表示出來,但偽代碼中零零散散的全都用到了,過多的輔助空間反而妨礙了理解算法本身。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM