如何加快Dijkstra演算法的執行速度?

2021-09-13 16:57:18 字數 1780 閱讀 2869

演算法導論(mit 6.006 第18講)

在dijkstra演算法中,面對單源單目標的最短路徑,如果遇到了要relax的節點u就是目標節點t,顯然就可以執行結束了。

dijkstra演算法
dijkstra演算法的探索路徑是從源一直往目標前景,那麼加速它的乙個角度就是從源開始探索的時候,同時從目標點向源開始探索,這種演算法即bi-directional search。

具體操作位,從源點和從目標兩個方向均開始搜尋,輪流的執行。兩個方向的搜尋意味著,在初始化的時候將有兩個路徑值:$d_f[u]$:向前搜尋最短路徑、$d_b[u]$向後搜尋最短路徑;兩個最小優先順序佇列 $q_f$、$q_b$;對應的前乙個節點指向 $\pi_f$、$\pi_b$;以及$s_f$、$s_b$

對於選出的頂點u,當他'同時'被前向搜尋和後向搜尋處理完成,或者說是『同時』從$q_f$、$q_b$中刪除了,此時可以結束。

可能想到的思路是,如果u是第乙個滿足結束條件的,那麼沿著各自的前向指標,即可找到最短路徑。以如下搜尋為例:

向前搜尋:從源點出發,使用dijkstra演算法,可以計算出$q_f$=,$s_f$=

向後搜尋:從目標出發,使用dijkstra演算法,可以計算出$q_b$=,$s_b$=

向前搜尋:從$q_f$中移除的最小值為 $d_f[a]$=3,執行邊(a,b)的relax操作,可得到$q_f$=,$s_f$=

向後搜尋:從$q_b$中移除最小值為$d_b[b]$=3,執行邊(a,b)的relax操作,可以計算出$q_b$=,$s_b$=

向前搜尋:從$q_f$中移除的最小值為 $d_f[u]$=5,執行邊(u,t)的relax操作,可得到$q_f$=,$s_f$=

向後搜尋:從$q_b$中移除最小值為$d_b[u]$=5,執行邊(s,u)的relax操作,可以計算出$q_b$=,$s_b$=

此時的u達到了終止的條件,同時從$q_f$和$q_b$中刪除,按照前向搜尋和後向搜尋的指標去計算最短路徑,發現為10,很明顯不是最短路徑。

正確的計算方式為:當終止之後,應該找到乙個頂點x,使得$d_f[x]$+$d_b[x]$最小。具體措施為,看$s_f$、$q_f$中的所有節點,看它在$s_b$、$q_b$中值,使得$d_f[x]$+$d_b[x]$最小

另一種演算法為goal-directed search ,詳見

如何加快exp imp的速度

oracle9i 或 10g 1.記憶體中關係到exp的速度的是 large pool size 適當設定大一些 2.適當加大exp 時的 buffer itpub個人空間 4f wiffg5u 2.direct y 快,是因為是直接路徑,資料不需要經過記憶體進行整合和檢查.1 exp調優 1.1 ...

Dijkstra演算法的實現

dijkstra演算法的實現 讀入 dijkstratxt 中的部分網路資料 test.txt 弧段起點id,弧段終點id,弧段距離 用dijkstra演算法生成的最佳路徑再寫入 routetxt.txt 檔案中 include include include include using names...

Dijkstra演算法的實現

最近自學了dijkstra演算法,跟著自己的理解寫了個 想加深對dijkstra演算法的理解,如有不足,還請多多指教。首先,dijkstra演算法主要是適用於找兩點之間的最小權值之和。思路 開始的時候,假設有兩個集合 分別為a,b集合 a集合為空 用來存放使用過的點 b集合存放著圖中的各點 當然,在...