algorithm - Dijkstra 算法运行时

标签 algorithm dijkstra

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

这是算法

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次,每次循环迭代,更新顶点(v)的优先级d(v)需要O(logV)时间在优先队列 PQ 中。但是这个操作需要我们在Priority Queue PQ中寻找顶点(v),需要O(v)的时间。那么时间复杂度O(E logV)如何。

--编辑-- 如果实际上 while 循环执行了 V 次,每次从 PQ 中提取一个元素,这意味着运行时间是 O(V logV),对吗?

最佳答案

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

关于algorithm - Dijkstra 算法运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21290696/

相关文章:

python - 使用 Dijkstra 计算目的地之间的最短路线,字典帮助。 (Python)

algorithm - 在加权图中找到最短路径

algorithm - 在决策树 ID3 算法中选择分区背后的直觉

algorithm - 八叉树 - 移动物体会影响哪些细胞?

python - 绘制给定两个端点的半圆形路径(3D)

c# - 如何找到一组中的哪些数字加起来与另一个给定数字相加?

algorithm - 根据给定算法计算 Big-O

java - 有人可以告诉我为什么这个 dijkstra 算法的实现不适用于负权重吗?

c++ - Dijkstra 算法 - 如何使用优先级队列或最小堆?

c++ - Dijkstra 算法输出不正确