利用伸展树提高区间操作的性能
来源:互联网 发布:mac ps窗口无法拖动 编辑:程序博客网 时间:2024/05/18 09:51
一、首先,什么是区间操作?以及各种数据结构性能对比
区间操作就是对一个序列的某个区间的所有元素进行的操作。比如,对区间所有元素增加一个值,翻转区间元素等。
对区间操作,最普通的方法就是数组。比如:对一个长为N 的序列的 [L,R]区间执行每个元素加上k 的操作,可以使用数组来保存序列,然后使用循环对[L,R]区间每个元素加k 。
代码是这样的:
//int A[],L,R,k; for i = L to R A[i] += k;
这样做的效率是 O(N),对于一个排序来说这是很好的性能,但对于一个操作来说,这并不是理想,很多二叉树的操作都能达到O( log N) 级别。
对于最典型的查找操作,普通二叉树的操作能达到O( log N) ,但是树在最坏情况下性能会退化到O(N)(比如順边的情况下) 。
平衡树能对树高度进行控制,最坏性能控制在O(log N),但是,平衡树只是控制了树的高度,而不能保证访问频率高的节点离跟越近,因此,平衡树的访问效率与节点的分布有关,如果访问频率高的节点离根很远,那么平衡树的性能就会有所降低。
因此,便有了伸展树。伸展树的特点就是:每次查找或插入节点,都会把该节点旋转到树根位置,随着操作次数增加,高频节点就会聚集在根周围,从而达到较好的性能。
二、伸展树介绍
伸展树的特点就是:每次查找或插入节点,都会把该节点旋转到树根位置,随着操作次数增加,高频节点就会聚集在根周围,从而达到较好的性能。
伸展树首先是一棵树,可以定义如下:
typedef struct Node{ int key; struct Node *lch,*rch,*parent;}* Node ,* Tree;
伸展树的高层操作有:
可见,树的高层操作都依赖与旋转等基本操作:
其实上述左旋和右旋很有规律,当一个节点是左节点时,应当右旋,当一个节点是右节点时,应当左旋。
伸展树的区间操作
伸展树操作区间的思路是:
第一步,分离区间。分离长度为N的序列里的区间 [L ,R ],首先找到第L大的元素,然后以其为界进行分离操作,得到t1 = [0,L-1] 和 temp = [L ,N]。
然后,再找到 temp 中第 R-L+1 大元素,并以该元素为界进行分离操作, 得到 t2 = [L ,R] 和 t3 = [R+1, N]。这样,就成功分离出了目标区间t2 。
第二步,对目标区间进行操作。
第三步,合并区间。合并t1,t2,t3。
- 利用伸展树提高区间操作的性能
- 伸展树的旋转和伸展操作
- 3303 翻转区间 伸展树的解法
- Splay tree 伸展树 (不含区间操作)模板
- 伸展树解决区间问题
- 序列神器伸展树 区间维护,区间提取,区间翻转的AC模板。
- 标题:伸展树的基本操作:
- POJ 3468 A Simple Problem with Integers (伸展树区间更新求和操作 , 模板)
- hdu 1890 伸展树区间翻转
- hdu1890 伸展树区间翻转复习
- 伸展树(插入、删除区间)BZOJ1269
- 伸展树splay之求区间极值
- CODEVS 1743(伸展树区间翻转)
- POJ 3468 区间查询区间修改 伸展树
- POJ 3580 SuperMemo(伸展树的基本操作)
- 提高Java IO操作的性能
- 伸展树的点点滴滴
- 伸展树的点点滴滴
- mac 下SVN
- svg绘制logo
- Java语言实现的装饰设计模式复习
- 建立docker 私有仓库
- HTTP协议学习(四)——Web服务器
- 利用伸展树提高区间操作的性能
- word使用中的标题
- PAT-PAT (Advanced Level) Practise Highest Price in Supply Chain(25) 【三星级】
- 蓝桥杯基础练习 01字串
- linux 默认 vi 启用 vim
- 2063 过山车(匈牙利算法-二分图最大匹配)
- Canal笔记
- Android多线程编程
- GRUB,UEFI