【问题标题】:Complexity of Dijkstra's Algorithm for Heap ImplementationDijkstra 堆实现算法的复杂性
【发布时间】:2019-07-31 17:44:07
【问题描述】:

在CRLS的书中,对Dijkstra算法的分析如下:

你需要使用堆多少次?一次从堆中拉出每个节点(即 CRLS 书中的 Extract-Min)--- O(N);并且每次查看边缘时----O(E),您可能需要更改距离(即CRLS书中的Decrease-Key),这意味着修复堆顺序。每个堆操作都需要 O(logN) 的工作。

因此,总时间复杂度:O((N + E)logN),如果所有顶点都可以从源到达,则为 O(ElogN)。

我的问题是: 如果所有顶点都可以从源到达,为什么复杂度变成 O(ElogN)?为什么我们可以忽略 O((N + E)logN) 中的 O(NlogN) 部分?

【问题讨论】:

  • O(E) * O(log N) = O(E log N)
  • @Lrrr 感谢您的评论。 O((N+E)logN) 中的 O(NlogN) 部分去哪了?
  • 有人知道吗?请帮忙!
  • O(N log N) 小于 O(E log N) 因为 E 在 O(N) 和 O(N^2) 之间所以我们可以忽略 O(N log N)跨度>

标签: algorithm graph


【解决方案1】:

如果所有顶点都可以从源到达,则图中至少有N-1 边,因此E >= N-1N = O(E)O((N + E) log N) = O((E + E) log N) = O(E log N)

【讨论】:

    【解决方案2】:

    如果所有节点都连接,则必须至少有 N-1 条边。所以 E >= N-1 因此 N

    【讨论】:

    • 聪明!太感谢了。你们两个都给出了相同的答案。如果允许,我也想接受你的。
    猜你喜欢
    • 2016-07-11
    • 1970-01-01
    • 2011-09-13
    • 2012-11-25
    • 2018-05-16
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多