【问题标题】:Running Time of Dijkstra's Algorithm - Priority Queue (Heap)Dijkstra 算法的运行时间 - 优先队列(堆)
【发布时间】:2015-07-14 00:12:59
【问题描述】:

我很难理解为什么带堆的 Dijkstra 算法的复杂性是 O( (m + n)*log(n) ),其中 m 是边数,n 是顶点数。

我的理解是:

现在我知道一个人必须做 n 删除分钟。 (每个 remove min 从堆中获取 log(n))。

然后必须执行 m 更新密钥。 (每个更新键需要 log(n))。

因此答案。我的概念清楚吗?否则您能否解释一下如何获得 Dijkstra 算法的时间复杂度。

【问题讨论】:

标签: algorithm time-complexity dijkstra


【解决方案1】:

复杂性略有不同,具体取决于您使用堆实现 Dijkstra 的方式。例如,我在c++ 中使用了内置的优先级队列,而这个堆不支持优先级更新。因此,每次我想更新给定元素的优先级时,我只需在堆中再推一个元素。这可能会导致我的堆大小变为m(仍然每个插入/弹出的复杂度为O(log(m)),与O(log(n)) 相同)。

如果你使用斐波那契堆,你可以降低算法的复杂度。

如果您使用常规二进制堆,您的分析非常正确 - 您需要将 m 个元素推送到支持 O(log(n)) 中的插入/弹出的堆中。您还需要至少删除最小元素n 次。

【讨论】:

    猜你喜欢
    • 2013-12-23
    • 2012-09-10
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    相关资源
    最近更新 更多