算法详解——左偏树

本文详细介绍了左偏树,一种用于高效合并优先队列的数据结构。内容包括左偏树的定义、性质、基础操作如merge、push、pop、build的实现,以及在算法竞赛中的应用。此外,还提及了如何使用C++的pb_ds库来操作左偏树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可并堆是啥

给你两个优先队列,要你合并这两个优先队列,而且还要保证合并后符合优先队列的性质,时间复杂度要限制在 log ⁡ ( s 1 + s 2 ) \log (s_1+s_2) log(s1+s2)之内。

怎么做?现在普通的堆已经满足不了要求了。

这个时候,就要用一种神奇的数据结构:左偏树了。

(二项堆,斐波那契堆不在本文的考虑范围内)

左偏树

顾名思义,左偏树就是一棵向左偏的树(逃

我们定义一个节点为外节点,当且仅当这个节点的左子树和右子树中的一个是空节点。(注意外节点不是叶子节点)

一个点的距离,被定义为它子树中离他最近的外节点到这个节点的距离(这与树的深度不同)

(图片来源:百度百科)

如图,蓝色的数字就是距离。

我们规定,空节点的距离为 − 1 -1 1

一个合格的左偏树,必须满足下列性质:

  • 性质1. 左偏树中,任何一个节点的父节点的权值都要小于等于这个节点的权值(堆性质)

    v a l f a i &lt; v a l i val_{fa_i}&lt;val_i valfai<vali

    这告诉我们:左偏树很像堆,如果长成了完全二叉树,那就是一个堆。

  • 性质2. 左偏树中任意一个节点的左儿子的距离一定大于等于右儿子的距离(左偏性质)

    d i s t l s i ≥ d i s t r s i dist_{ls_i}\ge dist_{rs_i} distlsidistrsi

    需要注意的一点:左偏指的不是左右儿子的大小,因此如果左儿子是一个点,而右儿子是一条很长的链,那也是满足要求的左偏树。

  • 推论1. 左偏树中任意一个节点的距离为其右儿子的距离 + 1 +1 +1

    d i s t i

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值