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