【问题标题】:Why do Fibonacci heaps need cascading cuts?为什么斐波那契堆需要级联切割?
【发布时间】:2013-04-11 04:48:01
【问题描述】:

我正在从“算法简介”学习 f-heap,而“减键”操作真的让我很困惑——为什么这需要“级联切割”?

如果删除此操作:

  1. make-heap()、insert()、minimum() 和 union() 的开销明显保持不变
  2. extract-min() 仍然是 O(D(n)),因为在 O(n(H)) 'consolidate' 操作中,大多数有根树的成本可以在添加到时支付根列表,剩余成本 O(D(n))
  3. decrease-key():显然是 O(1)

至于D(n),虽然我不能准确解释,但我认为它仍然是O(lgn),因为没有'cascading-cut',一个节点可能只是被移动到根列表a稍晚,任何节点隐藏在其父节点下不影响效率。至少,这不会让情况变得更糟。

为我糟糕的英语道歉:(

有人可以帮忙吗? 谢谢

【问题讨论】:

  • 好问题。把父位置的所有信息都扔掉似乎很不直观。

标签: algorithm data-structures complexity-theory big-o fibonacci-heap


【解决方案1】:

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

直观地说,您希望 k 阶树中的节点数在 k 中呈指数增长。这样,您只能在合并堆中拥有对数多棵树。如果你可以从一棵树上切割任意数量的节点,你就失去了这个保证。具体来说,你可以取一棵 k 阶树,然后砍掉它的所有孙子树。这会留下一棵有 k 个孩子的树,每个孩子都是叶子。因此,您可以创建只有 k + 1 个节点的 k 阶树。这意味着在最坏的情况下,您需要一棵 n - 1 阶的树来保存所有节点,因此 D(n) 变为 n - 1 而不是 O(log n)。

希望这会有所帮助!

【讨论】:

  • 是的,你是对的。这种误导性的 D(n) 确实会导致问题,但是当提取 D(n) 孩子的父母时,这不会出现(我写的原因在上面)。它出现在当他们的父级在“合并”期间选择其父级时——错误的 D() 会导致不平衡。现在考虑,如果用 cas-cut 减少一个 key 后,我可以像我做 cas-cut 一样保持所有的 D(n),也就是说,D() 可能小于孩子的数量——复杂度extract-min 仍然是 O(lgn)。很难保持完全相同的 D(),但我认为还有另一种方法可以保持平衡:
  • 每个节点都有一个 S :最初,它是节点的大小。显然,它是 2 的指数——在二进制表示法中,10..000。当它的子节点被移除,并且它的位数 ([log2(S)]) 减少(1000->111、1011->101 等)时,它会将差异报告给它的父节点。当差异大到足以减小父母的 [log2(s)] 时,会将差异报告给祖父母,依此类推。
  • 同样的一点是隐藏节点到父节点的减少,但在O中保持S(或D)与实际节点数量(S树至少有S/2个节点)之间的关系(1)时间,在巩固过程中,使用S/D保持平衡(合并具有相同D的节点,或相同的[log2(S)])。对吗?
  • FIX:在评论 1 中:在使用 cas-cut 减少密钥后 -> 在减少密钥 without cas-cut 之后(我的意思是,它的作用就像使用 cas -cut-fib-heap 来维护我的 non-cas-cut-fib-heap 中归档的所有 D())
  • @exprosic- 我认为这里有两个单独的问题。第一个 - 为什么斐波那契堆做级联切割? - 我试图在上面回答。你的第二个问题 - 我们可以用另一种方式吗? - 是一个非常有趣的,但我认为它可能不是最适合 Stack Overflow 的。您可能希望在 cs.stackexchange.com 或 cstheory.stackexchange.com 上详细描述您的方法,以便更多专业的计算机科学家可以查看。
猜你喜欢
  • 2012-12-29
  • 2012-12-16
  • 2010-11-24
  • 1970-01-01
  • 2016-11-18
  • 2010-12-19
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
相关资源
最近更新 更多