Dijkstra算法的时间复杂度如何?

时间:2018-12-12 21:59:46

标签: time-complexity 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}

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

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

Understanding Time complexity calculation for Dijkstra Algorithm

Complexity Of Dijkstra's algorithm

Complexity in Dijkstras algorithm

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

2 个答案:

答案 0 :(得分:1)

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

因此,复杂度就像您在其他循环中正确提到的那样:

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

答案 1 :(得分:0)

对于一般图形来说,它是O((V logV)+(E logV))= O(logV *(V + E))。

您不会仅仅假设图形是密集的,即| E |。 = O(| V | ^ 2),因为应用程序中的大多数图形实际上都是稀疏的,即| E | = O(| V |)。