首页 > 解决方案 > Dijkstra算法的时间复杂度是多少

问题描述

Dijkstra((V, E)):
  S = {}    //O(1)
  for each vertex v ∈ V:    //O(V)
    d[v] = ∞    //O(1)
  d[source] = 0    //O(1)
  while S != V:    //O(V)
    v = non visited vertex with the smallest d[v]    //O(V)
    for each edge (v, u):    //O(E)
      if u ∈/ S and d[v] + w(v, u) < d[u]:
        d[u] = d[v] + w(v, u)
    S = S ∪ {v}

注意: ∈/ 表示不在,我无法在代码中输入。

这个问题可能与某些帖子重复。

了解 Dijkstra 算法的时间复杂度计算

Dijkstra 算法的复杂性

Dijkstras 算法的复杂性

我阅读了它们,甚至在 Quora 上阅读了一些帖子,但仍然无法理解。我在伪代码中添加了一些注释并试图解决它。我真的很困惑为什么它是 O(E log V)

标签: time-complexitydijkstra

解决方案


如果您使用最小堆并且在最小堆中的插入是 O(log V),那么“具有最小 d[v] 的未访问顶点”实际上是 O(1 )。

因此,复杂性正如您为其他循环正确提到的那样:

  O((V logV) + (E logV)) = O(E logV) // Assuming E > V which is reasonable

推荐阅读