Dijkstra 堆实现算法的复杂性

Posted

技术标签:

【中文标题】Dijkstra 堆实现算法的复杂性【英文标题】:Complexity of Dijkstra's Algorithm for Heap Implementation 【发布时间】: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)跨度> 【参考方案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

【讨论】:

聪明!太感谢了。你们两个都给出了相同的答案。如果允许,我也想接受你的。

以上是关于Dijkstra 堆实现算法的复杂性的主要内容,如果未能解决你的问题,请参考以下文章

直接 Dijkstra 算法的时间复杂度

自己写的dijkstra算法的一个实现。

配对堆优化Dijkstra算法小记

最短路径-dijkstra算法

ACwing(基础)--- Dijkstra算法(含堆优化版)

最短路杂题