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-1
、N = O(E)
和O((N + E) log N) = O((E + E) log N) = O(E log N)
【讨论】:
【参考方案2】:如果所有节点都连接,则必须至少有 N-1 条边。所以 E >= N-1 因此 N
【讨论】:
聪明!太感谢了。你们两个都给出了相同的答案。如果允许,我也想接受你的。以上是关于Dijkstra 堆实现算法的复杂性的主要内容,如果未能解决你的问题,请参考以下文章