【发布时间】:2018-05-07 15:00:42
【问题描述】:
我知道这两种数据结构的实现,我想知道考虑到时间复杂度,哪个更好。
【问题讨论】:
标签: algorithm stl set priority-queue
我知道这两种数据结构的实现,我想知道考虑到时间复杂度,哪个更好。
【问题讨论】:
标签: algorithm stl set priority-queue
两者都具有相同的插入和擦除复杂度O(log n),而 get min 则适用于O(1)。
优先级队列只允许您按排序顺序访问一个元素,即,您可以获得最高/最低优先级的项目,当您删除它时,您可以获得下一个,依此类推。集合允许您按排序顺序完全访问,例如,在集合中间的某个位置找到两个元素,然后按顺序从一个元素遍历到另一个元素。
在优先级队列中可以有多个具有相同优先级值的元素,而在集合中则不能。
集合一般由二叉树支持,而优先级队列是堆。
那么问题是什么时候应该使用二叉树而不是堆?
在我看来,你不应该使用它们。检查二项式和斐波那契堆。对于素数算法,它们将具有更好的性能。
如果你坚持使用其中一个,我会选择优先级队列,因为它的内存占用更小,并且可以有多个具有相同优先级值的元素。
【讨论】:
从理论上讲,两者都会为您提供 O(E log V) 时间算法。这不是最优的;斐波那契堆给你 O(E + V log V),这对于密集图 (E >> V) 更好。
实际上,两者都不是最合适的。由于set 是长期存在的迭代器,因此可以实现一个DecreaseKey 操作,将额外存储从O(E) 减少到O(V)(解决方法是多次将顶点入队),但空间常数比@ 差987654322@,时间常数大概也是。您应该衡量您的用例。
如果内置函数不够快,我将支持 Jim Mischel 的二叉堆推荐(又名 priority_queue)-> 配对堆。
【讨论】: