【问题标题】:Why is time complexity of Dijkstras Algorithm O(V^2)为什么 Dijkstra 算法的时间复杂度为 O(V^2)
【发布时间】:2020-09-12 09:59:45
【问题描述】:

我刚刚阅读了维基百科中关于 Dijkstras 算法的文章,它说时间复杂度是 O(V^2)。 我的问题是我无法向自己解释。

谁能给我解释一下?

【问题讨论】:

    标签: algorithm time-complexity runtime shortest-path dijkstra


    【解决方案1】:

    使用数组的O(V^2) 解决方案与“常规”(优先队列)解决方案相同,但使用具有开放距离的数组,并在其中进行搜索而不是进行堆查找。

    open_nodes = [inf, inf, inf, ..., inf]
    d = [inf, inf, inf, ..., inf]
    open_nodes[source] = 0
    while d[target] == inf:
      v = argmin(open_nodes)  // O(V)
      d[v] = open_nodes[v]
      for each u such that (v,u) is an edge:
        if d[u] != inf:
          // relaxation:
          open_nodes[u] = min(open_nodes[u], d[v] + w(v,u))
        // close v
      open_nodes[v] = inf
    
    • 循环最多重复|V| 次,因为您关闭了一个节点 每次迭代,永远不要重新打开它。
    • argminO(|V|)。这基本上是在未排序的数组中找到最小值。
    • 松弛需要 O(1),并且最多重复 O(|E|) 次,因为您对每个传出边最多调用一次。

    这给了我们O(|V|^2 + |E|)的总数,但由于|E| <= |V|^2,这只是O(|V|^2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-22
      • 2019-07-10
      • 2012-07-13
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      相关资源
      最近更新 更多