深入理解 Dijkstra 演算法實現原理

2021-09-24 23:04:29 字數 2318 閱讀 9427

迪傑斯特拉(dijkstra)演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。

它的主要特點是以起始點為中心向外層層擴充套件(廣度優先搜尋思想),直到擴充套件到終點為止。

參考部落格:資料結構--dijkstra演算法最清楚的講解

大概就是這樣乙個有權圖,dijkstra演算法可以計算任意節點其他節點的最短路徑

演算法思路

指定乙個節點,例如我們要計算 'a' 到其他節點的最短路徑

引入兩個集合(s、u),s集合包含已求出的最短路徑的點(以及相應的最短長度),u集合包含未求出最短路徑的點(以及a到該點的路徑,注意 如上圖所示,a->c由於沒有直接相連 初始時為∞

初始化兩個集合,s集合初始時 只有當前要計算的節點,a->a = 0

u集合初始時為a->b = 4, a->c = ∞, a->d = 2, a->e = ∞敲黑板!!!接下來要進行核心兩步驟了從u集合中找出路徑最短的點,加入s集合,例如a->d = 2更新u集合路徑,if ( 'd 到 b,c,e 的距離' + 'ad 距離' < 'a 到 b,c,e 的距離' )則更新u

迴圈執行 4、5 兩步驟,直至遍歷結束,得到a 到其他節點的最短路徑

演算法**

1.選定a節點並初始化,如上述步驟3所示

2.執行上述 4、5兩步驟,找出u集合中路徑最短的節點d 加入s集合,並根據條件if ( 'd 到 b,c,e 的距離' + 'ad 距離' < 'a 到 b,c,e 的距離' )來更新u集合

3.這時候a->b, a->c都為3,沒關係。其實這時候他倆都是最短距離,如果從演算法邏輯來講的話,會先取到b點。而這個時候 if 條件變成了if ( 'b 到 c,e 的距離' + 'ab 距離' < 'a 到 c,e 的距離' )如圖所示這時候a->b距離 其實為a->d->b

思路就是這樣,往後就是大同小異了

演算法結束

**實現

public class dijkstra , 

, ,

,

};int start = 0;

int shortpath = dijkstra(weight1, start);

for (int i = 0; i < shortpath.length; i++)

system.out.println("從" + start + "出發到" + i + "的最短距離為:" + shortpath[i]);

}public static int dijkstra(int weight, int start)

}// 將新選出的頂點標記為已求出最短路徑,且到start的最短路徑就是dmin

shortpath[k] = dmin;

visited[k] = 1;

// 以k為中間點,修正從start到未訪問各點的距離

for (int i = 0; i < n; i++) }}

for (int i = 0; i < n; i++)

system.out.println("***********************************==");

return shortpath;}}

KMP演算法深入理解

knuth morris pratt演算法 簡稱kmp 是最常用字元傳匹配演算法之一。它以三個發明者命名,起頭的那個k就是著名科學家donald knuth。kmp演算法對於任何模式和目標序列,都可以在 線性時間 內完成匹配查詢,而不會發生退化。1 kmp演算法的原理 kmp演算法中主要的概念是ne...

深入理解KNN演算法

1.knn是個 消極 演算法,y f x1,x2,xp,x 其中x1,x2,xp是訓練資料,x是待分類或回歸查詢例項,y是分類或回歸結果.整個過程中沒有建立任何數學模型.2.與 積極 演算法的乙個關鍵差異 knn可以為不同的待分類查詢例項建立不同的目標函式逼近.3.knn的唯一假設,函式f是平滑的....

深入理解遞迴演算法

下面是對遞迴演算法執行過程的理解 結合漢諾塔問題 原始碼 public class hanoi else public static void main string args 為了方便我等下解釋執行過程,也把 的截圖貼在下面 準備工作做完了,正式開始理解過程的講解 以漢諾塔三個圓盤時為例,這裡n ...