左偏树

左偏树是一种可并堆,它在维护元素关键值的同时,还维护了一个“距离”,让它左边的比重更大(“左偏”之所在),以此保证对左偏树修改后能快速回复成堆。

距离

外结点:一个节点 $u$ 被称为外结点当且仅当 $u$ 的左子树或右子树是空的。

距离:结点 $u$ 的距离 $\mathrm{dist}(u)$ 是它与子树中外结点距离的最小值。由于其左偏性质(见下),一个点的距离其实就是一直往右直到空的长度,因此有 $\mathrm{dist}(u)=\mathrm{dist}\left(\text{right son}(u)\right)+1$

性质和定理

左偏树依赖堆性质左偏性质

  1. 堆性质:结点 $u$ 的关键值小于等于其子节点的关键值;
  2. 左偏性质:左儿子距离大于等于右儿子距离。

除此之外左偏树的距离和结点数有一些关系,这些关系可用于证明复杂度。

引理 1:一个左偏树的距离若为定值,则最小的左偏树是完全二叉树。

证明:距离为定值,则右子树距离确定,又要满足最小,则左子树的距离等于右儿子距离,递归下去就可知其为完全二叉树。

定理 1:若左偏树的距离为 $k$ ,则它至少有 $2^{k+1}-1$ 个结点。

证明:由引理 1 可知最少的情况是深度为 $k$ 的完全二叉树。

性质 3:由定理 1 可得,对于一棵 $n$ 个结点的左偏树,其距离最大为 $\lfloor\log(n+1)\rfloor-1$

运用

合并

总的来说就是,对于当前两个左偏树 $A,B$ ,若有一个为空就返回另一个,否则令 $A$ 是键值小的,然后递归到 $A$ 的右儿子和 $B$ 的合并。最后往上更新距离。

单点插入

给新的值建个左偏树去合并。 $\mathcal{O}(\log n)$

删顶

合并根左右子树。 $\mathcal{O}(\log n)$

删已知结点

合并左右子树,往上更新距离。

建树

把每个结点作为左偏树放入一个队列。然后每次取出两个队首合并放进队尾,直到只有一个左偏树。 $\mathcal{O}(n)$

例题

板子

EOF

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。

博客信息

作者
Jayun
时间
2023-11-12 16:26:57