迪傑斯特拉演算法總結

2021-08-10 13:42:28 字數 1680 閱讀 1239

總結:最短路徑演算法關鍵先把已知最短路徑頂點集(只有乙個源點)和未知的頂點分開,然後依次把未知集合的頂點按照最短路徑(這裡特別強調一下是源點到該頂點的路徑權重和,不僅僅是指它和父結點之間的權重,一開始就是在沒有這個問題弄清楚)加入到已知結點集中。在加入時可以記錄每個頂點的最短路徑,也可以在加入完畢後回溯找到每個頂點的最短路徑和權重。

迪傑斯特拉演算法用於求解乙個有向圖(也可以是無向圖,無向圖是有向圖的一種特例)的乙個點(稱之為原點)到其餘各點(稱之為周邊點)的最短路徑問題。演算法構思很是巧妙(我這麼認為),簡直達到了「無心插柳柳成蔭」的境界。演算法本身並不是按照我們的思維習慣——求解從原點到第乙個點的最短路徑,再到第二個點的最短路徑,直至最後求解完成到第n個點的最短路徑,而是求解從原點出發的各有向路徑的從小到大的排列(如果這個有向圖中有環1-2-3-1演算法豈不是永無終結之日了??!!

),但是演算法最終確實得到了從原點到圖中其餘各點的最短路徑,可以說這是個副產品,對於演算法的終結條件也應該以求得了原點到圖中其餘各點的最短路徑為宜。清楚了演算法的這種巧妙構思後,理解演算法本身就不是難題了。

演算法把乙個圖(g)中的點劃分成了若干部分:

1):原點(v);

2):所有周邊點(c);

另外有乙個輔助集合s,從v到s中的點的最短路徑已經求得。s的最初狀態是空集。

這樣就可以進一步劃分圖(g):

1):原點(v);

2):已求出v至其最短路徑的周邊點(s);

3):尚未求出v至其最短路徑的周邊點(other=c-s);

演算法的主體思想:

a、找到v——other所有路徑中的的最短路徑vd=v——d(other的乙個元素);

b、找到v——s——other所有路徑中的的最短路徑vi=v——i(other的乙個元素);

c、比較vd和vi如果vd<=vi則將d加入s且從other中刪除,否則將i加入s且從other中刪除。

重複以上步驟直至other為空集。

我們求得的最短路徑是公升序排列的,那為什麼下一條最短路徑就存在於v——

用到了貪心的策略

找最短的未拓展節點,加入已拓展部分

然後再根據此節點,重新更新未拓展部分

就是通過乙個方法,找到起始位置到目標位置的最優化路線

dijkstra演算法是典型最短路演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。

dijkstra演算法是很有代表性的最短路演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,運籌學等等。

dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用open, close表方式,drew為了和下面要介紹的 a* 演算法和 d* 演算法表述一致,這裡均採用open,close表的方式。

其採用的是貪心法的演算法策略

大概過程:

建立兩個表,open, close。

open表儲存所有已生成而未考察的節點,closed表中記錄已訪問過的節點。

1. 訪問路網中距離起始點最近且沒有被檢查過的點,把這個點放入open組中等待檢查。

2. 從open表中找出距起始點最近的點,找出這個點的所有子節點,把這個點放到close表中。

3. 遍歷考察這個點的子節點。求出這些子節點距起始點的距離值,放子節點到open表中。

4. 重複第2和第3步,直到open表為空,或找到目標點。