AVL Trees
定义
- Balance Factor:
- 注意空节点高度是-1,单个节点是0
Rotation | 旋转
单旋
Right-Right Rotation
- 逆时针
Left-Left Rotation
- 顺时针
双旋
Left-Right Rotation
两次单旋,先是 trouble maker 的RR Rotation,再是 LL Rotation
Right-Left Rotation
两次单旋,先是 trouble maker 的LL Rotation,再是RR Rotation
性质
这样单次查询的时间复杂度是,树的高度为
伸展树 | Splay Trees
Find
:::warning
- “Start from an empty tree at most
time”,从空树开始的连续M次操作时间不会超过
- 不意味着单次是
,个别操作可能超过。总的摊还时间是那么多
- 伸展树的核心想法是:一个节点被访问后,我们就通过一系列AVL树的旋转方法将它转至根节点
:::
接下来我们研究如何实现这样的想法:
我们尝试单旋:
我们会发现k3沉到了更底部,这不是我们想看到的,接下来我们给出旋转方法:Delete
接下来我们来看一下删除操作:
- 找到待删除元素X,经过AVL操作,X变为根节点
- 删除X,这时有两个子树
- 找到左子树的最大元素Y,经过AVL操作,Y变为左子树的根节点(Y没有右孩子)
- 将右子树接到左子树的右孩子上
Amortized Analysis | 摊还分析
分析方法:
- 聚合分析
- 核算法
- 势能方法
Aggregate Analysis | 聚合分析
对于连续的次操作最坏用
时间,那么单次摊还时间是
Accounting Method | 核算法
我的理解是“多退少补”