关于Fibonacci堆的设计和分析的问题

时间:2012-01-30 17:57:24

标签: algorithm data-structures amortized-analysis fibonacci-heap

斐波那契堆很难理解 - 即使CLRS已经成功了 非常好的尝试让它了解它是如何工作的。但有些问题 我真的不清楚:

  • 为什么你会选择像t + 2m这样的潜在功能?是什么原因?
  • 标记节点的原因是什么 - 我发现它很有用 根列表中的节点等,但你为什么要提出这样的方案呢?

谢谢!

1 个答案:

答案 0 :(得分:4)

选择潜在功能的原因与不同因素的组合有关。通常,电势选择为t + 2m,其中t是树的数量,m是标记节点的数量。我们可以分别分析这些部分。

首先,潜在函数包括t项,因为delete-min步骤通过重复地将链表中的不同树合并在一起来工作。执行此操作所需的时间取决于有多少树,每次迭代都会将树的数量减少到大致为O(log n)的数字,其中n是堆中节点的数量。通过使潜在函数包含一个t项,可以将完成崩溃所有树的工作返回到先前将树添加到此列表中的操作。

由于类似的原因,潜在的功能包括2m的术语。当我们调用reduce-key时,我们从其父节点切断节点,然后标记父节点。如果父母已被标记,我们将其剪切,然后标记其父母。这里完成的工作量与我们保持切割节点时所采用的路径的长度成比例,但随后它会对所涉及的所有节点进行取消标记。因此,如果我们有一个将标记节点的数量考虑在内的潜在函数,那么我们可以说,虽然单个长序列的切割可能很昂贵,但是这项工作可以退回到早期操作并且更均匀地分布。这个术语是2m而不是m的原因是,当我们通过减少被切割的节点数来降低潜力时,我们也通过将更多树添加回链表来增加t潜力。通过说标记节点中的每个下降将电位降低2,来自切割的潜在净下降为-1,因此我们可以对未来的合并步骤收取此减少。

至于我们为什么要进行标记 - 这主要是为了在确定可以保留在Fibonacci堆中的树的数量和大小时正确地计算出数学。人们可以争辩说,这是首先提出斐波纳契堆所需的真正的天才步骤。从本质上讲,如果你可以从每棵树上剪掉太多的孩子,那么堆就会失去平衡,如果你不能剪得足够多,那么就无法有效地实现减少键。找到“你可以失去一个孩子”的平衡是一个很好的妥协,并使得最终的数学表现得非常好。

希望这有帮助!