【问题标题】:Binomial heap: more efficient way for initial build than successive inserts?二项式堆:初始构建比连续插入更有效的方法?
【发布时间】:2014-07-31 19:37:52
【问题描述】:

有没有办法在最坏情况下复杂度低于 O(n log n) 的 n 个给定元素构建一个二项式堆,即使用 n 个连续插入? (我知道插入的摊销成本是 O(1),因此构建的平均时间复杂度更小。)对于二叉堆,有一个更有效的构建实现,它将所有 n 个元素放在二叉树中并执行 heapify/siftDown在元素的前半部分以相反的顺序。只是想知道:二项式堆是否存在类似的聪明?

【问题讨论】:

  • 如果插入分期摊销O(1),这意味着n次插入花费了O(n)的总时间

标签: algorithm heap binomial-heap


【解决方案1】:

实际上,将所有 n 个值插入堆中只需要 O(n) 时间。尽管二项式堆插入的最坏情况运行时间为 O(log n),但平均而言它低于此值。

这是使用摊销分析来查看这一点的一种方式。在二项式堆中的每棵树上放置一个信用。每当您进行插入时,如果它涉及将 k 个不同的树合并在一起,则实际运行时间为 Θ(1 + k)。在此过程中,我们还将花费 k 个学分,每棵树合并一个,因此摊销成本为 O(1)。因此,任何一系列 n 次插入到空二项式堆中,假设没有中间删除,将花费时间 O(n)。与二进制堆不同,即使您事先不知道元素 n 的数量,这也有效。

或者,您可以使用惰性二项式堆,其中插入需要最坏情况 O(1) 的时间,而删除的平均时间为 O(log n)。在这种情况下,一系列 n 次插入也将花费 O(n) 时间。

希望这会有所帮助!

【讨论】:

  • 感谢您的解释,尤其是关于惰性插入的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 2012-12-12
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多