簡體   English   中英

在elogv時間內實現dijkstra算法

[英]implementing dijkstra algorithm in elogv time

1) Create a Min Heap of size V where V is the number of vertices in the given graph. 
   Every node of min heap contains vertex number and distance value of the vertex.
2) Initialize Min Heap with source vertex as root (the distance value assigned to source
   vertex is 0). The distance value assigned to all other vertices is INF (infinite).
3) While Min Heap is not empty, do following
    a) Extract the vertex with minimum distance value node from Min Heap. Let the 
    extracted vertex be u.
    b) For every adjacent vertex v of u, check if v is in Min Heap. If v is in Min Heap
       and distance value is more than weight of u-v plus distance value of u, then 
       update the distance value of v.

我當時正在考慮在C ++中為Dijkstra實現此偽代碼。 這是為了快速實施。 我在這里有些困惑,即我們正在使用堆來跟蹤未開發區域的相鄰頂點的Dijkstra分數。 在3b中,我們需要檢查u的每個相鄰頂點v,檢查v是否為minHeap,minHeap是否在恆定時間內支持這種操作,堆是用於搜索的最差的數據結構,應該花費線性時間來搜索是否存在是否在最小堆中,此外,我們還必須更新相鄰的頂點,所以不僅我們應該知道它是否在minHeap中,而且還要知道它的位置以便我們可以更新它,我們希望所有這些都在logv時間發生,否則沒有一點快速實施的意義。 應該使用什么數據結構代替Heap?

PS:我說的是圖形作為鄰接表實現的實現。

在最壞的情況下,Dijkstra的算法必須執行|E| DecreaseKey操作和|V| ExtractMin操作。

  1. 在二進制堆數據結構中,DecreaseKey和ExtractMin操作的成本均為O(log(n))。 因此,算法的總成本為O(|E|log(|V|) + |V|log(|V|))

  2. 如果我們使用斐波那契堆而不是簡單的二進制堆,則可以將總成本降低為O(|E| + |V|log(|V|))因為現在DecreaseKey操作的攤銷成本為O(1)

此外,對於圖形中的每個頂點,還必須維護一個指向堆中相應元素的指針數組。 這樣就可以在O(1)標識堆中的頂點

暫無
暫無

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

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