可融合的优先队列操作

随机可熔堆(也称为可熔优先级队列)支持许多常用操作。这些称为插入,删除和搜索操作findMin。根据特定于可熔堆Meld(A1,A2)的附加操作来实现插入和删除操作。

融化

融合(也称为合并)操作的基本目标是获取两个堆(通过获取每个堆的根节点)A1和A2,然后将它们合并,从而返回一个堆节点。该堆节点是堆的根节点,该堆包含来自两个以A1和A2为根的子树的所有元素。

该融合操作的一个出色功能是可以递归定义。如果两个堆都与null值关联,则合并将以一个空集完成,并且该方法将返回非空堆的根节点。如果A1和A2都不为零,请检查A1> A2。如果是,则将两者交换。因此,确保A1 <A2并且合并堆的根节点将包含A1。然后,我们将A2与A1.left或A1.right递归合并。这一步是随机化的地方,因为要合并哪一侧的决定是掷硬币决定的。

function Meld(Node A1, Node A2)
if A1 is nil => return A2
if A2 is nil => return A1
if A1 > A2 => swap A1 and A2
if coin_toss is 0 => A1.left = Meld(A1.left, A2)
else A1.right = Meld(A1.right, A2)
return A1

完成融合操作后,插入可融合堆非常简单。首先,创建一个包含值p的新节点a。然后,将这个新节点简单地与堆根节点合并。

function Insert(p)
Node a = new Node
a.p = p
root = Meld(a, root)
root.parent = nil
increment node count

去掉

与插入操作一样简单,Remove()实现了Meld操作以从堆中消除根节点。这可以通过简单地融合根节点的两个孩子并将返回的节点作为新根来实现。

function Remove()rootNode = Meld(rootNode.left, rootNode.right)
if rootNode is not nil => rootNode.parent = nil
decrement node count

FindMin

可能是随机可熔堆的最简单操作,FindMin()只是返回存储在堆根节点中的当前元素。

附加操作

可以应用于可熔堆的一些额外操作也具有最坏情况下的O(logn)效率-

  • Remove(a)-从堆中删除节点a及其键。

  • Absorb(P)-将可熔堆P的所有元素加到该堆中,在此过程中清空P。

  • DecreaseKey(a,q)-将节点a中的键减小到q(前提:q <= ap)。