Dijkstra算法的运行时间 - 优先级队列(堆)

时间:2015-05-04 14:43:09

标签: algorithm time-complexity dijkstra

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

我的理解是:

现在我知道必须要删除分钟。 (每次删除min都会从堆中获取log(n)。

然后必须做更新密钥。 (每个更新密钥都使用log(n))。

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

1 个答案:

答案 0 :(得分:0)

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

如果使用Fibonacci堆,可以降低算法的复杂性。

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