来自picture的这个Wikipedia article有三个标记为蓝色的Fibonacci堆节点。在此数据结构中标记某些节点的目的是什么?
答案 0 :(得分:11)
直观地说,Fibonacci堆维护了一组不同顺序的树,在发生delete-min时合并它们。构建Fibonacci堆的希望是每棵树都包含大量节点。每棵树中的节点越多,需要在树中存储的树的数量就越少,因此在每次删除min上花费的时间就越少。
同时,Fibonacci堆尝试尽可能快地进行减少键操作。要做到这一点,Fibonacci堆允许子树被“切掉”其他树并移回到根。这使得reduce-key更快,但是使每个树保持更少的节点(并且还增加了树的数量)。因此,设计结构存在根本性的紧张。
为了使其工作,Fibonacci堆中树的形状必须受到一定限制。直观地说,Fibonacci堆中的树是binomial trees,允许丢失少量子节点。具体来说,Fibonacci堆中的每棵树最多只能丢失两个孩子,然后才能在后续步骤中对该树进行“重新处理”。 Fibonacci堆中的标记步骤允许数据结构计算到目前为止丢失了多少个孩子。未标记的节点没有丢失子节点,标记的节点丢失了一个子节点。一旦标记的节点丢失了另一个子节点,它就丢失了两个子节点,因此需要移回根节点进行重新处理。
许多入门算法教科书都记录了其工作原理的具体细节。这根本不起作用并不明显,数学有点棘手。
希望这提供了一个有用的直觉!
答案 1 :(得分:3)
当一个节点由于减少键而被切断时,会标记一个节点。当第二个孩子被切断时,该节点也会从其父节点切割自己。完成标记,以便您知道第二次切割的时间。
答案 2 :(得分:0)
来自Wiki的很好的解释:操作reduce键将接管节点,减小键,如果违反了heap属性(新键小于父级键),则会从其父级中剪切节点。如果父级不是根,则会对其进行标记。如果已被标记,则也会对其进行剪切并标记其父对象。我们继续向上直到到达根节点或未标记的节点。现在,如果最小值指针是新的最小值,则将最小值指针设置为减小的值。