[学习笔记]平衡树(Splay)——旋转的灵魂舞蹈家
1.简介
首先要知道什么是二叉查找树。
这是一棵二叉树,每个节点最多有一个左儿子,一个右儿子。
它能支持查找功能。
具体来说,每个儿子有一个权值,保证一个节点的左儿子权值小于这个节点,右儿子权值大于这个节点。
显然可以证明,这个树的中序遍历就是树上的序列从小到大排序后的结果。
我们插入一个值,就类似二分,从根往下找,直到进入一个空节点,然后插入。
查询的时候,比如查询前驱后继第k大等等,本质上都是通过比较左右儿子的权值/子树大小等来决策。
由于和节点的加入顺序有关,
所以,二叉查找树这样可以被轻松卡成一条链,然后每次查询链的底部,就卡成一次O(n)的了。
我们发现,同一个正确的中序遍历下的二叉查找树可能形态有很多。
而如果一个二叉查找树是满的二叉查找树,那么树高就是logn的,查询复杂度O(logn)非常可观。
所以,我们能不能通过一些手段,使得这棵二叉查找树总是能保持在logn的树高左右呢?
如果树高能够保证在logn的话,那么就称这个树是平衡的。
这也是平衡树的由来。
所以,平衡树一种能维持树高为logn的二叉查找树。
属于高级数据结构。
2.平衡树分类(查询均摊logn)
treap:
tree+heap
维护中序遍历之外,每个点随机一个优先级。
根据优先级,进行左旋或者右旋。
splay
直接双旋保证复杂度。
可以证明。(我不会,记住就好了)
fhq 非旋转treap
SBT ??
RBT 红黑树,map的实现。
替罪羊树 ??
3.treap及操作
单旋,把儿子和父亲交换。
分为左旋右旋。

4.Splay及操作
没有优先值,但是采用双旋。
每次查询或者加入一个点,都把这个点旋转到根。
双旋的巧妙之处:
1.永远单旋是不够的。因为一条链转完还是一条链。
2.双旋一定程度上会把链缩短。
5.Splay的利用(每次最后都要splay到根)
单点操作:
①加入一个权值。从顶向下找,找到空节点加入。
②删除一个权值。找到这个权值节点,splay到根,把这个节点的后继splay到根的右儿子。
删除这个点。把根设为右儿子。(没有后继,那直接就是左儿子)
(也可以仿照区间删除的方法)
③单点加。同上。
区间操作:
通性:把l-1旋转到根。r+1旋转到根的右儿子。r+1左儿子的子树就是待处理区间。
可以支持懒标记。
懒标记和普通线段树的懒标记一样,作用点直接处理。然后打上标记。
标记必须支持合并、下放。
①区间加:提出区间后,r+1左儿子sum标记
②区间翻转:打翻转标记。同时交换左右儿子。
③区间删除:提出区间,后删除。
④区间插入:不能一个个insert,会被卡成n^2。
x到根,x+1到根右儿子。把要加入的数分治地建成一棵小平衡树。(分治直接保证logn树高)
然后接到x+1的左儿子。
查询操作:
一律先提出区间,然后直接查询根的右儿子的左儿子。
①区间求最大子段和:同线段树。每个节点代表一个区间,维护区间左起最大值,区间右起最大值,区间最大子段和,区间和。
提取完区间,直接查询。
②区间和。
如果出题人丧心病狂,让你维护一个序列,支持以上所有操作怎么办?
以及更多具体操作见:[NOI2005]维护数列——平衡树观止
upda:2018.11.14
Splay还有一个用途:LCT维护实链。
6.数据结构的通性
1.数据结构的题目往往可以O(n^2)暴力写部分分。
考虑我们为什么要用数据结构,什么时候用。
数据结构:二叉堆,左偏树,tire树,栈,队列,哈希,链表,树状数组,并查集,分块,点分治,线段树,动态开点线段树,主席树,二叉查找树,平衡树
①维护正确性。hash主要针对的就是这一点。
②维护复杂度。包括空间和时间复杂度。
空间:主席树,动态开点线段树
时间:剩下的大部分。
还有一些:trie,队列,栈。
数据结构往往都是从维护这两部分的角度出发设计。
2.要分清数据结构和原序列、树本身,否则容易懵。
3.抓住数据结构(尤其平衡树)的形态,就比较容易理解,并且还能推理构造出其他的操作。
[学习笔记]平衡树(Splay)——旋转的灵魂舞蹈家的更多相关文章
- 学习笔记--(平衡树)splay
坑爹的splay,毁我青春,耗我钱财,颓我精力 是一种用于保存有序集合的简单高效的数据结构.伸展树实质上是一个二叉查找树.允许查找,插入,删除,删除最小,删除最大,分割,合并等许多操作,这些操作的时间 ...
- 【学习笔记】splay入门(更新中)
声明:本博客所有随笔都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 前言 终于学习了 spaly \(splay\) !听说了很久,因为dalao总 ...
- webgl学习笔记三-平移旋转缩放
写在前面 建议先阅读下前面我的两篇文章. webgl学习笔记一-绘图单点 webgl学习笔记二-绘图多点 平移 1.关键点说明 顶点着色器需要加上 uniform vec4 u_Translation ...
- 普通平衡树学习笔记之Splay算法
前言 今天不容易有一天的自由学习时间,当然要用来"学习".在此记录一下今天学到的最基础的平衡树. 定义 平衡树是二叉搜索树和堆合并构成的数据结构,它是一 棵空树或它的左右两个子树的 ...
- [学习笔记] 平衡树——Treap
前置技能:平衡树前传:BST 终于学到我们喜闻乐见的平衡树啦! 所以我们这次讲的是平衡树中比较好写的\(Treap\). (以后会写splay的先埋个坑在这) 好了,进入正题. step 1 我们知道 ...
- 学习笔记:Splay
代码适中.非常灵活的平衡树. 需要前置:二叉搜索树. 一些基础的函数: int idx, ch[N][2], cnt[N], sz[N], fa[N]; /* idx 是节点计数, ch[i][0 / ...
- 学习笔记 | treap | splay
目录 前言 treap 它的基本操作 前言 不会数据结构选手深深地感受到了来自treap的恶意QwQ 在听的时候感觉自己听得听懂的??大概只是听懂了它的意思 代码是怎么写都感觉写不好╮(╯﹏╰)╭ 菜 ...
- webgl学习笔记五-纹理
写在前面 建议先阅读下前面我的三篇文章. webgl学习笔记一-绘图单点 webgl学习笔记二-绘图多点 webgl学习笔记三-平移旋转缩放 术语 : 纹理 :图像 图形装配区域 :顶点着色器顶点坐标 ...
- webgl学习笔记四-动画
写在前面 建议先阅读下前面我的三篇文章. webgl学习笔记一-绘图单点 webgl学习笔记二-绘图多点 webgl学习笔记三-平移旋转缩放 下面我们将讲解下如何让一个正方形动起来~不断擦除和重绘 ...
随机推荐
- 从零开始的Python学习Episode 20——面向对象(3)
面向对象之封装 封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体. 隐藏 在python中用双下划线开 ...
- 记一次线上gc调优的过程
近期公司运营同学经常表示线上我们一个后台管理系统运行特别慢,而且经常出现504超时的情况.对于这种情况我们本能的认为可能是代码有性能问题,可能有死循环或者是数据库调用次数过多导致接口运行 ...
- linux获得命令使用帮助
1. 内部命令: help CMD 2. 外部命令: CMD --help 3. 命令手册: manual(所有命令) man CMD 分章节: 1: 用户命令(User Commands - /bi ...
- 第10讲:利用SQL语言实现关系代数操作
一.实现并.交.差运算 1. 基本语法形式:子查询 [union [all] | intersect [all] | except [all] 子查询] ①意义:将关系代数中的∪.∩.- 分别用uni ...
- Task 10 统计从1到某个整数之间出现的1的次数
任务:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12) = 5. 在3 ...
- 团队作业7——第二次项目冲刺(Beta版本12.09——12.10)
1.当天站立式会议照片 本次会议在5号公寓3楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据项目要求还没做的完成. 2.每个人的工作 经过会议讨论后确定了每个人的分工 组员 任务 陈福鹏 倒计 ...
- 解决亚马逊云服务器上安装nginx后无法访问的问题
在亚马逊云服务器上装了Ubuntu系统,使用docker环境搭建nginx,启动nginx容器后,在浏览器输入地址后,显示连接超时. 在网上查了一下说有可能是服务器安全组的设置问题 然后在云服务器的安 ...
- Spring 2.0
ProductBacklog:继续向下细化; 1.界面美化,统一界面风格,以简洁美观为主: 2.丰富版面的内容,吸引用户: 3.尝试增加新的版面: Sprint 计划会议:确定此次冲刺要完成的目标 1 ...
- js中的php rand函数
//文件rand.js function MyRand(min, max){ this.min = min; this.max = max; } MyRand.prototype.getRand = ...
- 检查cpu是否支持VT-X(HAXM)
可以使用CPU-Z进行检测,CPU是否支持VT-X,如果不支持,就不要浪费时间安装HAXM了. 可以试一下Genymotion模拟器.