Dijkstra的算法运行时

时间:2014-01-22 18:12:19

标签: algorithm dijkstra

我知道这可能不是一个好问题,但我想知道它的运行时是如何O(ElogV)。

这是Algo

DIJKSTRA(G,w,s)
S=null
PQ=G.V
while (PQ!=null)
    u=Extract-Min(PQ)
    S=S+u \\Add node u to set S(explored vertices)
    foreach (v in adj(u))
        if(d(v) > d(u) + w(u,v) )
            d(v) = d(u) + w(u,v)  \\at this step, we need to update the priority d(v) of vertex (v) in the Priority Queue. 

时间复杂度由O(E logV)给出,因为内部循环最多运行E次,并且对于每次循环迭代,需要O(logV)时间来更新顶点(v)的优先级d(v)在优先级队列PQ中。但是这个操作要求我们在优先级队列PQ中搜索顶点(v),这需要花费O(v)时间。那么时间复杂度O(E logV)如何呢?

- Edit-- 实际上,while循环执行V次,每次从PQ中提取一个元素,这意味着运行时间为O(V logV),对吧?

1 个答案:

答案 0 :(得分:2)

您无需在优先级队列中搜索v。插入优先级队列时,可以在v索引的数组中保留对插入节点的引用,并立即查找。