平衡树学习笔记
平衡树
平衡树就是为了实现一类元素在线性结构中动态变化的功能所需要的数据结构。
平衡树是一种基于二叉搜索树的数据结构。
满足:左儿子
也就是一切小于根节点的在左边,一切大于根节点的在右边。
这样想要查找一个节点的位置时间复杂度就是
平衡树主要有三种:Splay,fhq_Treap,Treap。
我这次主要讲前两种。
当然还有其他的像替罪羊树,红黑色。
Splay
Splay 是 LCT 的基础操作。
本人以为还是 Splay 比较好理解的。
核心操作
Splay 的基本操作就是将BST旋转,分左旋和右旋(其实都差不多)。
旋转的要求:在不改变原有的中序遍历的前提下改变树的结构。
简化一下:把儿子节点与父亲节点的身份互换,且有BST性质。
旋转
具体描述
设要旋转的节点为
- 将
的左儿子设为 的右儿子 - 若
的右儿子存在,将 的右儿子的父亲设为 - 将
的右儿子设为 - 将
的父亲设为 - 将
的父亲设为 - 若
存在,将 的某个子节点(原来 所在的子节点)设为
双旋操作
在 Splay 中,每加入一个新的节点就需要把它旋转到根。
设当前需旋转的节点为
如下图:
时间复杂度
对于这个时间复杂度的分析,我们需要用一下势能分析。
设
所以根据定义,我们可以得出:
即
因为根据
考虑每一次的
对于zig:
对于zig-zig
那么Splay到根的均摊代价为
再算上
所以总时间复杂度为
操作实现
讲了核心操作和时间复杂度后,我们来看看它可以支持的操作。
注:由于我们只能保证 Splay 本身的时间复杂度,所以我们就必须只能通过旋转来实现一些操作。
查询数值
给定一个数
- 若
小于等于左子树大小,就向左子树走 - 否则,将
先减去左子树大小和当前节点的 ,使得 , 等于在右子树中的排名。然而若 小于等于 ,说明已经找到,进行旋转,并返回当前节点权值。
查询 的前驱和后继
我们先将
- 前驱:就是
左子树中最右边的节点。 - 后继:就是
右子树中最左边的节点。
删除节点
我们需要先将
然后将前驱旋转到根,再将后继旋转到根,就会得到下图:
直接把
查询区间
我们需要将
而
fhq_Treap(无旋Treap)
前言
首先,我们要
dalao 发明了 fhq_Treap,因为 fhq_Treap 是三种平衡树中最强悍的一种了,它可以维护值域,可以维护下标,可以维护区间修改,它还可以完成可持久化操作。其唯一弱于 splay 的就是在维护 LCT 上。
什么是 fhq_Treap
fhp_Treap 首先是一个 Treap。
而 Treap 是什么呢
Treap=BST+Heap。
所以 Treap 就是一个拥有二叉搜索树的性质,但是每一个节点都通过一个附加权值来满足符合堆的性质。
而这个附加权值就是 Treap 的一个关键,它是通过随机生成一个
而我们随机生成的 (教练:你让随机
但是一个旋转的 Treap 是有点恶心的。
所以,我们的无旋 Treap 就登场了。
核心操作
我们要想 Treap 不旋转,我们就需要一个可以顶替旋转的一种操作来实现,那就是拆分与合并。
split
split 就是把 Treap 以
对于我们遍历到每一个点,假如它的权值小于
因为它的最多操作次数就是一直分到底,时间复杂度就是
对于前
这个用递归就可以实现了。
merge
merge 就是把被分开的两颗 Treap 合并起来。
因为第一个 Treap 的权值都比较小,我们比较一下它的
也就是说,我们其实是遍历了第一个 Treap 的根定为最大节点,第二个 Treap 的根就是最小节点,时间复杂度就是
操作实现
插入数值
插入一个权值为
- 把 Treap 以权值
分成两颗。 - 将权值
插入。 - 再把两颗 Treap 合并以来。
删除数值
删除一个权值为
- 把 Treap 以权值
分成两颗。 - 将权值
删去。 - 再把两颗 Treap 合并以来。
查询指定值的排名
如果是在一个有序的序列中查询排名,我们可以二分查找这个序列,然后根据找到的元素的下标来确定排名,假设下标从
在 fhq_Treap 上,我们就直接按
总结
平衡树大体就利用 BST 性质,通过一些如旋转,分裂合并的操作来实现将我们需要进行修改的节点或子树独立出来,在进行修改。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具