我知道两种数据结构的实现,我想知道考虑时间复杂度哪个更好。
答案 0 :(得分:1)
从理论上讲,两者都会给你一个O(E log V)时间算法。这不是最佳的; Fibonacci堆给出O(E + V log V),这对于密集图(E> V)更好。
实际上,两者都不是理想的选择。由于set
长期存在迭代器,因此可以实现DecreaseKey操作,将额外存储从O(E)减少到O(V)(解决方法是将顶点多次入列),但空间常数更差比priority_queue
,时间常数也可能。你应该测量你的用例。
我将推荐Jim Mischel推荐的二进制堆(a.k.a。,priority_queue
) - >如果内置不够快,则配对堆。
答案 1 :(得分:1)
两者都具有相同的插入和擦除复杂度O(log n)
,而get min适用于O(1)
。
优先级队列只允许您按排序顺序访问一个元素,即,您可以获得最高/最低优先级项目,当您删除它时,您可以获得下一个,依此类推。集合允许您按排序顺序进行完全访问,例如,在集合中间的某处找到两个元素,然后按顺序从一个到另一个遍历。
在优先级队列中,您可以拥有多个具有相同优先级值的元素,而在set中则不能。
Set通常由二叉树支持,而优先级队列是堆。
所以问题是你何时应该使用二叉树而不是堆?
在我看来,你不应该使用它们。检查二项式和斐波那契堆。对于素数算法,它们将具有更好的性能。
如果你坚持使用其中一个,我会使用优先级队列,因为它具有较小的内存占用,并且可以有多个具有相同优先级值的元素。