【问题标题】:Which implementation is best for Prims algorithm , using Set or Prority Queue ? why?哪个实现最适合 Prim 的算法,使用 Set 或 Priority Queue ?为什么?
【发布时间】:2018-05-07 15:00:42
【问题描述】:

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

【问题讨论】:

    标签: algorithm stl set priority-queue


    【解决方案1】:

    两者都具有相同的插入和擦除复杂度O(log n),而 get min 则适用于O(1)

    优先级队列只允许您按排序顺序访问一个元素,即,您可以获得最高/最低优先级的项目,当您删除它时,您可以获得下一个,依此类推。集合允许您按排序顺序完全访问,例如,在集合中间的某个位置找到两个元素,然后按顺序从一个元素遍历到另一个元素。

    在优先级队列中可以有多个具有相同优先级值的元素,而在集合中则不能。

    集合一般由二叉树支持,而优先级队列是堆。

    那么问题是什么时候应该使用二叉树而不是堆?

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

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

    【讨论】:

    • 斐波那契堆的性能不太可能明显优于二叉堆,而且很可能会更差。斐波那契堆具有出色的理论性能,而二叉堆,尤其是配对堆在现实世界中的表现优于它。为什么?因为斐波那契堆的渐近性能伴随着一个巨大的常数。另外,实施起来很困难。我的建议是使用二进制堆来运行它,如果你认为它需要优化,则使用配对堆。
    • @JimMischel 你是完全正确的,这是真的,但我正在考虑两者的自定义实现。当然如果你使用已经实现的堆结构,它会比自定义的像斐波那契堆快得多。
    • Set 也可以有多个具有相同优先级值的元素,就像在 Prims 算法的情况下,我们在 Set 中插入一对。例如:- (0,1) 和 (0,5) 可以存在。
    • @RaviBhatt by the official docs你不能see here 但是如果你放置对象并且该对象中只有一个参数负责优先级,并且在你的情况下你做的比你可以拥有的(0, 1) 和 (0,5)。
    【解决方案2】:

    从理论上讲,两者都会为您提供 O(E log V) 时间算法。这不是最优的;斐波那契堆给你 O(E + V log V),这对于密集图 (E >> V) 更好。

    实际上,两者都不是最合适的。由于set 是长期存在的迭代器,因此可以实现一个DecreaseKey 操作,将额外存储从O(E) 减少到O(V)(解决方法是多次将顶点入队),但空间常数比@ 差987654322@,时间常数大概也是。您应该衡量您的用例。

    如果内置函数不够快,我将支持 Jim Mischel 的二叉堆推荐(又名 priority_queue)-> 配对堆。

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多