我很难理解为什么带有堆的Dijkstra算法的复杂度为O((m + n)* log(n))其中m是边数,n是顶点数。
我的理解是:
现在我知道必须要删除分钟。 (每次删除min都会从堆中获取log(n)。
然后必须做更新密钥。 (每个更新密钥都使用log(n))。
因此答案。我的概念清楚了吗?否则,请您解释如何获得Dijkstra算法的时间复杂度。
答案 0 :(得分:0)
根据您使用堆实现Dijkstra的方式,复杂性会略有不同。例如,我在c++
中使用内置优先级队列,并且此堆不支持优先级更新。因此,每次我想更新给定元素的优先级时,我只需在堆中再推送一个元素。这可能会导致我的堆大小为m
(仍然每个插入/弹出的复杂度为O(log(m))
,与O(log(n))
相同。
如果使用Fibonacci堆,可以降低算法的复杂性。
如果使用常规二进制堆,则分析非常正确 - 您需要在支持O(log(n))
中的insert / pop的堆中推送m个元素。您还需要删除至少n
次的最小元素。