我正在从'引入算法'中学习f-heap,而'减少键'操作确实让我困惑 - 为什么这需要'级联切换'?
如果删除此操作:
至于D(n),虽然我无法准确解释,但我认为它仍然是O(lgn),因为没有'级联切割',节点可能只是被移动到根列表a稍后,隐藏在其父下的任何节点都不会影响效率。至少,这不会使情况变得更糟。
为我可怜的英语道歉:(
任何人都可以帮忙吗? 感谢答案 0 :(得分:7)
级联切割的原因是保持D(n)低。事实证明,如果允许从树中剪切任意数量的节点,则D(n)可以增长为线性,这使得delete和delete-min需要线性时间。
直观地说,您希望k阶树中的节点数在k中成指数。这样,您只能在合并堆中以对数方式存在多个树。如果您可以从树中剪切任意数量的节点,则会失去此保证。具体来说,你可以采取一个k阶树,然后切断所有的孙子。这留下了一棵有k个孩子的树,每个孩子都是叶子。因此,您可以创建k阶树,其中只有k + 1个节点。这意味着在最坏的情况下,您需要一个n - 1的树来保存所有节点,因此D(n)变为n - 1而不是O(log n)。
希望这有帮助!