数据结构Note:伸展树(Splay Tree)
2017-06-06 20:05
190 查看
基本思想: 每个节点被访问时,使用旋转操作将其移动到根。
旋转是自底向上的,因此需要设置父亲指针
单次双旋,分若干种情况讨论
!p->father x==y->left Zig(x)
x==y->right Zag(x)
p->father (令p=x->father)
x==p->left
p==p->father->left Zig(p) Zig(x)
p==p->father->right Zig(x) Zag(x)
x==p->right
p==p->father->left Zag(x) Zig(x)
p==p->father->right Zag(p) Zag(x)
伸展操作:不断重复的双旋
while ((p=x->father)!=NULL) DoubleRotate;
Insert 插入 正常Insert以后Splay
Merge 合并 设待合并集合为A,B,首先伸展A中的最大元素,然后将B作为它的右子树
Split 分裂 对分裂中心进行伸展,那么它的左右子树就是分裂后的两个集合
Delete 删除 首先以待删除元素作为中心进行分裂,然后对分裂结果进行合并
其它操作:伸展可能会提供更多便利
4000
n个结点的伸展树m次操作的总时间开销为O(mlogn)。
旋转是自底向上的,因此需要设置父亲指针
核心操作:伸展
Splay(x)保持伸展树有序性的前提下,将元素x调整到树的根部单次双旋,分若干种情况讨论
!p->father x==y->left Zig(x)
x==y->right Zag(x)
p->father (令p=x->father)
x==p->left
p==p->father->left Zig(p) Zig(x)
p==p->father->right Zig(x) Zag(x)
x==p->right
p==p->father->left Zag(x) Zig(x)
p==p->father->right Zag(p) Zag(x)
伸展操作:不断重复的双旋
while ((p=x->father)!=NULL) DoubleRotate;
接口实现:五种基本操作
Search 查找 正常Search以后SplayInsert 插入 正常Insert以后Splay
Merge 合并 设待合并集合为A,B,首先伸展A中的最大元素,然后将B作为它的右子树
Split 分裂 对分裂中心进行伸展,那么它的左右子树就是分裂后的两个集合
Delete 删除 首先以待删除元素作为中心进行分裂,然后对分裂结果进行合并
其它操作:伸展可能会提供更多便利
4000
n个结点的伸展树m次操作的总时间开销为O(mlogn)。
相关文章推荐
- 数据结构之伸展树
- Java数据结构与算法解析(八)——伸展树
- 数据结构之伸展树详解
- Java数据结构与算法解析(八)——伸展树
- 自顶而下伸展树 数据结构说解
- 数据结构实现之Splay伸展树
- Java数据结构与算法解析(八)——伸展树
- 获取Oracle表结构时,两种OleDb驱动得到的列数据类型“DATA_TYPE”值的类型不同
- 数据结构知识——树的三种不同遍历算法解析
- MySQL数据目录结构大全
- 数据结构大学教程之数据结构及其基本概念(2)
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 数据库中如何保存多级结构的数据
- 经典数据结构题目
- 数据结构
- 数据结构实验2
- 数据结构大学教程之数据结构及其基本概念(1)
- Windows 日志存储数据结构
- c# 数据结构
- 如何删除某个用户的所有表的数据而保留表结构?