使用Set或Prority Queue,哪种实现最适合Prims算法?为什么?

时间:2018-05-07 15:00:43

标签: algorithm stl set priority-queue

我知道两种数据结构的实现,我想知道考虑时间复杂度哪个更好。

2 个答案:

答案 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通常由二叉树支持,而优先级队列是堆。

所以问题是你何时应该使用二叉树而不是堆?

在我看来,你不应该使用它们。检查二项式和斐波那契堆。对于素数算法,它们将具有更好的性能。

如果你坚持使用其中一个,我会使用优先级队列,因为它具有较小的内存占用,并且可以有多个具有相同优先级值的元素。