如何获得斐波那契堆的最坏情况

时间:2011-11-12 17:36:01

标签: algorithm data-structures

什么样的操作顺序会给斐波纳契堆最坏的情况?每个节点除最后一个节点外只有一个子节点?

例如:

5
|
6
|
7
|
8

2 个答案:

答案 0 :(得分:2)

我认为jpalecek的答案不会产生请求的树。在这里试试:

http://www.cse.yorku.ca/~aaw/Jason/FibonacciHeapAnimation.html

此外,只需插入任意数量的元素然后提取-min一次即可获得相同的结果。无论如何,那不是请求。

要获得您想要的表单,请执行以下操作:

  • 插入任意数量的元素 - 比如1到10。
  • 提取min(现在你有一棵树)
  • 将所有孩子减少到-inf除了最左边,从最深处开始,从左到右(见下面的演示)。
  • 每次减少后,删除min
  • 重复步骤3

示例:

  • 插入1到10:

start

  • 提取min:

extractMin

  • 7减少到0

firstDec

  • 提取min:

extractMin

  • 5减少到0,提取分钟,减少40,提取分钟,减少30,提取分钟,将10减少到0,提取最小值:

fin

修改

我忘了有一个delete操作使decrease然后extract min,所以你可以使用它而不是减少然后提取min 我在上面做

请注意,现在当你有一个“单路径”树时,你可以通过这一系列的O(1)操作轻松地扩展它:

  • 插入小于min的3个元素
  • 提取min
  • 删除新的右孩子

演示(继续示例的最后一步):

  • 插入10-1

insert_3_elements

  • 提取min:

extractMin2

  • 删除新的右子女(1):

deeper

所有图片均由this website

创建

答案 1 :(得分:-1)

这实际上是最好的情况(正如你所看到的,extract-min总是很容易,因为我们已经订购了元素)。你应该通过以这种方式插入一系列反向排序的元素(也就是说,最小元素将是最后一个)来获得它:

  1. 插入两个元素
  2. 提取分钟
  3. 重复