Algorithm 为什么斐波那契堆需要级联削减?

Algorithm 为什么斐波那契堆需要级联削减?,algorithm,data-structures,complexity-theory,big-o,fibonacci-heap,Algorithm,Data Structures,Complexity Theory,Big O,Fibonacci Heap,我正在从“算法简介”学习f-heap,“减少密钥”操作真的让我困惑——为什么这需要“级联剪切” 如果删除此操作: make-heap()、insert()、minimum()和union()的成本显然保持不变 extract-min()仍然是O(D(n)),因为在O(n(H))的“合并”操作中,大多数根目录树的成本可以在添加到根目录列表时支付,其余成本为O(D(n)) 减少键():O(1) 至于D(n),虽然我不能精确地解释它,但我认为它仍然是O(lgn),因为没有“级联切割”,一个节点可能只是

我正在从“算法简介”学习f-heap,“减少密钥”操作真的让我困惑——为什么这需要“级联剪切”

如果删除此操作:

  • make-heap()、insert()、minimum()和union()的成本显然保持不变
  • extract-min()仍然是O(D(n)),因为在O(n(H))的“合并”操作中,大多数根目录树的成本可以在添加到根目录列表时支付,其余成本为O(D(n))
  • 减少键():O(1)
  • 至于D(n),虽然我不能精确地解释它,但我认为它仍然是O(lgn),因为没有“级联切割”,一个节点可能只是在稍晚的时候移动到根列表中,并且任何节点隐藏在其父节点下都不会影响效率。至少,这不会让情况变得更糟

    为我糟糕的英语道歉:(

    有人能帮忙吗?
    感谢

    级联剪切的原因是将D(n)保持在较低的水平。事实证明,如果允许从树中剪切任意数量的节点,则D(n)可以增长为线性,这使得delete和delete min需要线性时间

    直观地说,您希望k阶树中的节点数以k为指数。这样,在合并堆中只能有对数数量的树。如果您可以从树中剪切任意数量的节点,您将失去这一保证。具体地说,您可以采用k阶树,然后剪切其所有子树。这将一个有k个子树,每个子树都是叶子。因此,您可以创建k阶树,其中只有k+1个节点。这意味着在最坏的情况下,您需要一个n-1阶树来容纳所有节点,因此D(n)变成n-1,而不是O(logn)


    希望这有帮助!

    是的,你是对的。这种误导性的D(n)确实会导致问题,但在提取D(n)孩子的家长时(我写的原因如上所述)不会出现这种情况。当他们的家长在“合并”过程中选择家长时会出现这种情况——错误的D()现在考虑,如果在用CAS割减一个密钥之后,我可以像我做CAS割一样保持所有的D(n),也就是说,d()可能小于儿童的数量——提取min的复杂性仍然是O(LGN)。,但我认为还有另一种保持平衡的方法:每个节点都有一个s:最初,它是节点的大小。显然,它是2的指数——用二进制表示法,10..000。当它的子节点被删除时,它的位数([log2(s)]减少了(1000->111,1011->101,等等),它将差异报告给其父级。当差异大到足以减少父级的[log2(s)]时,差异将报告给祖父母,依此类推。相同的一点是将节点的减少隐藏到父级,但在O(1)中保留s(或D)和实际节点数(具有s的树至少有s/2个节点)之间的关系时间,在合并过程中,使用S/D来保持平衡(合并具有相同D或相同[log2(S)]的节点。是这样吗?修复:在注释1中:在使用cas cut减少一个键之后->在没有cas cut的情况下减少一个键之后(我的意思是,它就像使用cas cut fib堆来维护我的非cas cut fib堆中的所有D()字段一样)@exprosic-我认为这里有两个独立的问题。第一个-为什么斐波那契堆会进行级联切割?-我试图回答上面的问题。第二个问题-我们可以用另一种方式进行吗?-非常有趣,但我认为这可能不是最适合堆栈溢出的方法。您可能希望在e它是cs.stackexchange.com或cstheory.stackexchange.com,以便更多的专家计算机科学家可以查看它。这是一个好问题。仅仅扔掉所有位于家长位置的信息似乎是非常不明智的。