簡體   English   中英

O((V + E)* W)中的Dijsktra算法

[英]Dijsktra's algorithm in O((V+E)*W)

假設我有一個有向圖G(V,E)在其邊緣上具有積分正權重。如果我知道對於每個邊緣e∈E weight(e)∈{0,1,.. 2 ^ W}(其中W相對較小)如何在O((V + E)* W)中實現dijsktra的算法?

我嘗試修改Dial的算法,如果weight(e)∈{0,1,..,W},我可以使用存儲桶並在O(V * W + E)中實現dijsktra,但是我似乎無法獲得良好的結果。

當我必須實現Dijkstra的算法時,我通常使用二進制堆來執行它, 而沒有 reduce_key操作。

為此,您將(成本,頂點)記錄放入堆中,並且每當一個頂點的成本下降時,您只需放入一個新的記錄即可。 當您從堆中彈出一個頂點時,如果已經完成,則可以忽略它。 無論如何,您都必須跟蹤完成了哪些頂點,這很容易。

這會占用更多的空間,但是復雜度仍然為O(| E | log V)(與O(| V + E | log | V |相同)或O(| E | log | E |算法將遍歷的連接組件)

現在的log | E |的因子 上面的事實來自於| E | 堆中的元素。 如果將具有相同優先級的所有元素分組到列表中並將這些列表放入優先級隊列,則該日志| E | 因素變成對數(不同優先級的數量)。 注意,堆數組不再是優先級隊列的合適結構,但是各種有序樹都可以正常工作。 當您不需要reduce_key時,這很容易。

在您的情況下,優先級隊列前面的頂點之間的成本差異與優先級隊列中最高的成本之間的差異最大為2 ^ W。 這意味着隊列中最多有2 ^ W個不同的優先級,使用這種優先級隊列的Dijkstra算法的復雜度為O(| E | W)。

由於您不想分配2 ^ W個存儲桶,因此鏈表的Patricia樹將為您的案例提供一個可行的優先級隊列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM