【问题标题】:What's the time complexity of Dijkstra's AlgorithmDijkstra算法的时间复杂度是多少
【发布时间】:2019-05-14 02:08:40
【问题描述】:
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 上阅读了一些帖子,但仍然无法理解。我在伪代码中放了一些 cmets 并试图解决它。我真的很困惑为什么它是 O(E log V)

【问题讨论】:

    标签: time-complexity dijkstra


    【解决方案1】:

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

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

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

    【讨论】:

    • +喜欢。很好的答案。为什么“假设 E > V 这是合理的”这是合理的?
    • 边数少于顶点数的图将具有不连贯的组件,出于算法的目的可以忽略这些组件。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-22
      • 2020-01-26
      • 2020-04-15
      • 2014-12-20
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多