什么时候最好在Dijkstra中实现优先级队列作为最小堆,何时使用普通数组更好?
一个有运行时间O(V^2 + E)
,另一个有O((V+E)logV)
。当E< V
时,那么
O(V^2+E) = O(V^2)
并且它比O((V+E)logV)=O(2VlogV)=O(VlogV)
当V< E
,O(V^2 + E)= O(E^2)
和O((V+E)logV) = O(ElogV)
时,堆实现似乎再次变得更好。
它们也具有相同的空间复杂度,即O(n)
。
我认为有些情况下Dijkstra中的最小优先级队列的简单数组实现更好,但实际上并不能想到这种情况。
答案 0 :(得分:0)
对于Dijkstra,@ JimMischel说,我想不出任何一个例子,我认为它不存在。但是,对于UCS(统一成本搜索),它专注于找到到单个完成节点的单个最短路径而不是到每个节点的最短路径,我可以想一个例子。这将涉及状态之间的过渡是统一的问题。
比方说,我们正在解决15拼图(所有过渡都有成本1)。此外,在这类问题中,解决方案成本的范围是众所周知的,因此您可以使用一系列状态进行探索,其中每个成本存储具有此类成本的简单路径向量。在这种情况下,每个操作都有O(1)
,并且使用数组比使用二进制最小堆更有效。