何时使用二项式堆?

时间:2013-11-20 12:32:05

标签: algorithm data-structures

Binomial Heap设计非常特别。我个人认为这种设计不直观。

尽管像What is the difference between binary heaps and binomial heaps?这样的帖子讨论了差异及其专长,但我仍然想知道何时应该使用它。

http://en.wikipedia.org/wiki/Binomial_heap中,它说

  

由于其独特的结构,可以使用k阶的二叉树   通过连接其中一个,从k-1的两棵树中简单地构造   他们是另一个人的根最左边的孩子。这个功能是   二进制堆的合并操作的核心,这是它的主要   优于其他传统堆。

我认为二项式堆的优势在于它的合并。但是,Leftist heap也有O(logN)合并并且更简单,为什么我们仍然使用二项式堆?我什么时候应该使用二项式堆?


修改

我想问的一个实际问题是二项式堆的优势究竟是什么

4 个答案:

答案 0 :(得分:5)

您的问题没有一般性答案。

像这样的库级算法的运行时关系与数据大小的常数因素通常决定了选择哪个。例如,如果在n = 1时O(1)运算比O(log n)运算慢20倍,那么最好选择N(log n)算法n <1。 1,000,000。

结论是渐近时间界限只是一个指导。如果

,你会使用二项式而不是左派堆
  1. 差异在申请中很重要。 (如果它不使用最便宜的可靠实现,无论算法如何。)
  2. 在您正在构建的特定应用程序中,BH基准测试优于LH。
  3. <强>加 在回应OP的评论时,他正在寻找动机:我不能代表这个算法的作者。但总的来说,即使算法开发人员提供的优势是边缘的或纯粹的理论,算法开发人员仍然可以找到新颖,美观的方法并发布它们。

    这很好。这就是计算机科学的发展方向。 方法可以在其他设置中获得巨大回报,即使手头的问题没有大赢。

    这个(旧的)例子是1989年开发的跳过列表,用于解决同样的问题,其效率与平衡二叉搜索树非常接近,后者在1962年或更早时就已知。何必?因为我们可以。

答案 1 :(得分:5)

Leftist tree的文章说:

  

将新节点插入树时,会创建一个新的单节点树并将其合并到现有树中。要删除最小项目,我们删除根,然后合并左右子树。这两个操作都需要O(log n)时间。对于插入,这比支持在分摊的常量时间O(1)和O(log n)最坏情况下插入的二项式堆慢。

所以看来二项堆的优点是插入速度更快。

至少,这是asympotitic分析告诉我们的。现实世界的运行时间完全不同,正如Gene在他的回答中所说,取决于不变因素。您可以确定哪种方法更适合您的应用程序的唯一方法是测试它们。

答案 2 :(得分:3)

二项式堆在对数时间内支持合并操作(破坏性地合并两个堆),而在二进制堆中需要线性时间。

答案 3 :(得分:0)

二元堆&lt;二项式堆&lt;斐波那契堆

这仅限于表现。 来自Wiki,

+------------+---------------+----------+-----------+
| Operation  |    Binary     | Binomial | Fibonacci |
+------------+---------------+----------+-----------+
| Find-min   | Θ(1)          | Θ(1)     | Θ(1)      |
| delete-min | Θ(log n)      | Θ(log n) | O(log n)  |
| insert     | Θ(log n)      | Θ(1)     | Θ(1)      |
| dec-key    | Θ(log n)      | Θ(log n) | Θ(1)      |
| merge      | Θ(m log(n+m)) | O(log n) | Θ(1)      |
+------------+---------------+----------+-----------+