浅谈splay
\(BST\)
二叉查找树,首先它是一颗二叉树,其次它里面每个点都满足以该点左儿子为根的子树里结点的值都小于自己的值,以该点右儿子为根的子树里结点的值都大于自己的值。如果不进行修改,每次查询都是\(O(logn)\)的。
\(Splay\)
\(splay\)是一种支持旋转的二叉查找树,由于旋转可以维护它的深度,使其保持平衡,所以我们又称它为平衡树。一般的平衡树支持的操作它基本都支持,不支持的比如有可持久化。所以我们不多赘述,直接讲它的特性:
旋转
\(zig和zag\)
单次旋转。若一个点是它父亲的左儿子,把它旋转上去,让它父亲成为它的右儿子,则称为\(zig\),否则称为\(zag\)。
根据下面这张图我们可以很好的理解\(zig\)和\(zag\)。
然后这两种单旋操作配合起来一共有四种双旋操作,分别是\(zig-zig\),\(zig-zag\),\(zag-zig\),\(zag-zag\)。
如果你觉得很烦,那你千万不要离开,因为本篇博客,就是来帮助你解忧的。
双旋单旋分情况讨论记不清怎么办?来来来,继续往下看,妈妈绝对不会再担心你的\(splay\)写挂了。
对于一次旋转,只会影响的四个结点,分别是\(x\)本身,\(x\)的父亲\(fa\),\(x\)的儿子\(s\),\(fa\)的父亲\(ffa\)。
设\(t(x)\)为\(x\)与其父亲的关系,左儿子为\(0\),右儿子为\(1\),那么\(t(s)=t(x)xor\) \(1\)。
第一步:把\(fa\)扳下来。
先确定\(fa\)与\(s\)的双方关系,\(fa\)在\(t(x)\)方向上认\(s\)做儿子,\(s\)认\(fa\)做父亲。然后按照此步骤确定\(x\)与\(fa\)的双方关系。
第二步:把\(x\)送上去。
确定\(x\)与\(ffa\)的双方关系。
代码如下:
int t(int u){return son[fa[u]][1]==u;}
void rotate(int u){
int ret=t(u),f=fa[u],s=son[u][ret^1];
int ffa=fa[f],ret_f=t(f);
son[f][ret]=s;if(s)fa[s]=f;//确立s与fa的关系
son[u][ret^1]=f;fa[f]=u;//确立u与fa的关系
fa[u]=ffa;if(ffa)son[ffa][ret_f]=u;//确立u与ffa的关系
}
至此,单旋操作就没了,是不是非常简单呢?
\(splay\)
\(splay\)操作就是让一个点\(x\)一直旋转一直旋转直到它到根为止。有单旋和双旋两种操作,单旋就是直接\(while\)循环调用上面那段代码就行了,双旋有四种情况,但是总的来说也只有两种。
当\(t(x)==t(fa)\)时,那就先单旋\(fa\),否则单旋一次\(x\)。
不管上面那个条件满不满足,都在第二次单旋一次\(x\)。
代码如下:
void splay(int u){
while(fa[u]){//有父亲就不是根
if(fa[fa[u]]){//可以双旋
if(t(fa[u])==t(u))rotate(fa[u]);
else rotate(u);//如上所述
}rotate(u);
}root=u;//旋转到根之后更新根
}
至此,\(splay\)的旋转操作就到此为止了,怎么样,是不是很简单呢?
哦对了,\(splay\)的复杂度十分玄学,在势能分析上来说,应该是\(log\)的,但是保持这个势能需要多多\(splay\),插入要\(splay\),删除也要\(splay\)。
插入
找到一个整个树里面权值最接近插入结点权值的点,然后把要插入的点给它做儿子,然后\(splay\)到根。
删除
把要删除的点\(splay\)到根,然后把它左儿子子树里最大的值旋到根的左儿子处,断开要删除的点的周边所有关系,把右子树的根接在左子树最大值右儿子处即可。
若需区间删除,则把\(l-1splay\)到根,把\(r+1splay\)到根的右儿子处,然后整个右儿子的左子树全部扔掉即可。
大多数时刻区间翻转区间加等操作都是这样,把要处理的区间这样放在根的右儿子的左子树处,然后直接打标记即可,这里我们就不多说了。
模板:https://www.cnblogs.com/AKMer/p/9985277.html
区间操作模板:https://www.cnblogs.com/AKMer/p/9987089.html
浅谈splay的更多相关文章
- 浅谈splay(点的操作)
浅谈splay(点的操作) 一.基本概念 splay本质:二叉查找树 特点:结点x的左子树权值都小于x的权值,右子树权值都大于x的权值 维护信息: 整棵树:root 当前根节点 sz书上所有结点编号 ...
- 浅谈splay的双旋
昨晚终于明白了splay双旋中的一些细节,今日整理如下 注:题目用的2002HNOI营业额统计,测试结果均来及codevs 网站的评测结果 http://codevs.cn/problem/1296/ ...
- 简析平衡树(三)——浅谈Splay
前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...
- Lct浅谈
Lct浅谈 1.对lct的认识 首先要知道$lct$是什么.$lct$的全称为$link-cut-tree$.通过全称可以看出,这个数据结构是维护树上的问题,并且是可以支持连边断边操作.$lct$ ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
随机推荐
- iOS自动化探索(八)Mac上的Jenkins安装
安装Jenkins 首先检查是否有Jenkins依赖的java环境 java -version 出现java version "1.8.xx"说明已经安装了java Jackeys ...
- Algorithm3: 获得一个int数中二进制位为1 的个数
获得一个int数中二进制位为1 的个数 int NumberOfOne(int n){ int count = 0; unsig ...
- Java复习9网路编程
Java 复习9网路编程 20131008 前言: Java语言在网络通信上面的开发要远远领先于其他编程语言,这是Java开发中最重要的应用,可以基于协议的编程,如Socket,URLConnecti ...
- hdu3829
题解: 对于每一个孩子裂点+建边 如果i孩子讨厌的和j孩子喜欢的相同,那么建边 然后跑最大独立集 代码: #include<cstdio> #include<cstring> ...
- 【前端工具】seajs打包部署工具spm的使用总结
相信使用seajs的好处大家都是知道的,接触seajs好像是在半年前,当时还不知道页面阻塞问题,这里不带多余的话了. seajs实现了模块化的开发,一个网站如果分了很多很多模块的话,等开发完成了,发现 ...
- Spring整合Hibernate:1、annotation方式管理SessionFactory
1.在applicationContext.xml文件中初始化SessionFactory(annotation方式) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 ...
- Sqlserver 存储过程 返回-6
存储过程中没有返回 手动返回-6的代码,但是一直接收到-6返回值. 经最后研究发现,是粗心导致的,Insert插入数据时在非空字段插入了Null值导致出现异常,所以返回了-6. 所以说在事务中,可能会 ...
- GridView 控制默认分页页码间距 及字体大小
GridView 控制默认分页页码间距 及字体大小 PagerCss TD A:hover { WIDTH: 20px; COLOR: black; padding-left: 4px; paddin ...
- 【干货】Kaggle 数据挖掘比赛经验分享(mark 专业的数据建模过程)
简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比赛,相继获得了 C ...
- XOR Queries(莫队+trie)
题目链接: XOR Queries 给出一个长度为nn的数组CC,回答mm个形式为(L, R, A, B)(L,R,A,B)的询问,含义为存在多少个不同的数组下标k \in [L, R]k∈[L,R] ...