标记Fibonacci堆中的某些节点的目的是什么?

Gee*_*eek 1 heap priority-queue data-structures fibonacci-heap

图片来自维基百科的文章有蓝色标记的斐波那契堆的三个节点.在此数据结构中标记某些节点的目的是什么?

tem*_*def 11

直观地说,Fibonacci堆维护了一组不同顺序的树,在发生delete-min时合并它们.构建Fibonacci堆的希望是每棵树都包含大量节点.每棵树中的节点越多,需要在树中存储的树的数量就越少,因此在每个delete-min上花费的时间就越少.

同时,Fibonacci堆尝试尽可能快地进行减少键操作.要做到这一点,Fibonacci堆允许子树被"切掉"其他树并移回到根.这使得reduce-key更快,但是使每个树保持更少的节点(并且还增加了树的数量).因此,设计结构存在根本紧张.

为了实现这一点,Fibonacci堆中树的形状必须受到一定限制.直观地说,Fibonacci堆中的二叉树,允许丢失少量子节点.具体来说,Fibonacci堆中的每棵树最多只能丢失两个孩子,然后才能在后续步骤中对该树进行"重新处理".Fibonacci堆中的标记步骤允许数据结构计算到目前为止丢失了多少个孩子.未标记的节点没有丢失子节点,标记的节点丢失了一个子节点.一旦标记的节点丢失了另一个子节点,它就丢失了两个子节点,因此需要将其移回根节点进行重新处理.

许多入门算法教科书都记录了其工作原理的具体细节.这根本不起作用并不明显,数学有点棘手.

希望这提供了一个有用的直觉!


Iri*_*iel 4

当一个节点的子节点之一由于减少键而被切割时,该节点就会被标记。当第二个子节点被切断时,该节点也会将其自身从其父节点中切断。进行标记以便您知道第二次切割何时发生。