可并堆
堆
这里给出插入的过程,以大根堆为例:每次若叶子那层的点数不满,则插入到紧接着的下一个点,此时可能不满足条件,向上调整。
删除:直接交换根和叶子然后删掉,将新根向下调整(从两个儿子中选择较大的一个拉上来)。
左偏树
非常神奇的东西,莫名其妙的复杂度就对了。
考虑对于二叉树,定义外节点是儿子不满的节点(即儿子数量小于两个),一个节点的 \(dist\) 为到子树中最近的外节点经过的边数,空节点的 \(dist\) 为 \(0\)。
左偏树是一个堆(显然为二叉树),同时满足,左儿子的 \(dist\) 不小于右儿子的 \(dist\),因此一个节点的 \(dist\) 就是右儿子的 \(dist+1\)。\(dist\) 有一个非常重要的性质,\(n\) 个点的二叉树的 \(dist\) 为 \(O(\log n)\),考虑至少有 \(2^{dist-1}\) 层是满的。
合并
非常神秘的对于 \(dist\) 的势能分析。
考虑合并的时候取出两个堆中优先级更高的根作为新根,然后左儿子不变,右儿子递归合并,若合并后不满足“左偏”性质则交换左右儿子。时间复杂度为 \(O(\log n)\),考虑每次递归两个堆至少有一个的 \(dist\) 会减小 \(1\)。
删除任意节点
合并左右儿子,然后向上调整,该过程时间复杂度为 \(O(\log n)\)。注意若满足则立即结束向上调整过程。
标记
可以打标记。