平衡树学习笔记(6)-------RBT】的更多相关文章

RBT 上一篇:平衡树学习笔记(5)-------SBT RBT是...是一棵恐怖的树 有多恐怖? 平衡树中最快的♂ 不到200ms的优势,连权值线段树都无法匹敌 但是,通过大量百度,发现RBT的代码都是从STL扒的qwq 蒟蒻根本无法研究透彻 关键时候,崔大钊(<-----数据结构巨佬)使用了终极武器花_Q帮助了我(雾 硬生生把左旋右旋压在一起,800多行-->100多行,使我更加透彻QAQ 感激不尽(^▽^) 不废话了qwq RBT,中文名红黑树,即Red-Black-Tree 是个巨佬级…
SBT 上一篇:平衡树学习笔记(4)-------替罪羊树 所谓SBT,就是Size Balanced Tree 它的速度很快,完全碾爆Treap,Splay等平衡树,而且代码简洁易懂 尤其是插入节点多的时候,比其它树快多了(不考虑毒瘤红黑树) 尤其是它的平衡操作maintain,均摊\(O(1)\)!!!! 他maintain跟Splay差不多,都是依靠旋转来平衡 不过他可不想splay那样直接转到根,而是有条件的旋转 拿上图来说,SBT对于每个点,有两个平衡条件,假设说当前点是A,那么要满足…
Splay 上一篇:平衡树学习笔记(2)-------Treap Splay是一个实用而且灵活性很强的平衡树 效率上也比较客观,但是一定要一次性写对 debug可能不是那么容易 Splay作为平衡树,它的平衡方式就是旋转 暴力旋转,赤裸裸的旋转,各种旋转 就是依靠玄学的旋转来保证自己的复杂度 不废话,上主题 \(\color{#9900ff}{定义}\) struct node { node *ch[2], *fa; //父亲,孩子 int val, siz; //权值,大小 node(node…
Treap 上一篇:平衡树学习笔记(1)-------简介 Treap是一个玄学的平衡树 为什么说它玄学呢? 还记得上一节说过每个平衡树都有自己的平衡方式吗? 没错,它平衡的方式是......rand!!!! 注意,Treap是不依靠旋转平衡的!! 我认为它的思想是最好理解的,代码也简洁易懂(虽然慢了点) 而且灵活性较高,尤其是平衡树合并qwq 洛谷P3369普通平衡树跑了600多ms \(\color{#9900ff}{定义}\) struct node { node *ch[2]; int…
BST,Splay平衡树学习笔记 1.二叉查找树BST BST是一种二叉树形结构,其特点就在于:每一个非叶子结点的值都大于他的左子树中的任意一个值,并都小于他的右子树中的任意一个值. 2.BST的用处 如果利用朴素算法序列中的第k大的数,最坏的情况下可能达到O(N*logN),而由于BST的特性,我们可以把复杂度优化为O(logN),不仅如此,我们还可以在O(logn)的复杂度下查找元素,O(1)的复杂度下修改元素.对于有些数据来说,极大地节约了时间. 3.BST的优化---splay平衡树 再…
前言 今天不容易有一天的自由学习时间,当然要用来"学习".在此记录一下今天学到的最基础的平衡树. 定义 平衡树是二叉搜索树和堆合并构成的数据结构,它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树. 这里仅仅说明一下平衡树中的\(Splay\)算法 进入正题 平衡树中有许多种类:红黑树.\(AVL\)树,伸展树,\(Treap\)等等,但是\(Splay\)算法算是可用性很强的一种了.也就是说比较稳定. 在\(Splay\)算法中,一个处处都要…
0XFF 前言 *如果本文有不好的地方,请在下方评论区提出,Qiuly感激不尽! 0X1F 这个东西有啥用? 树套树------线段树套平衡树,可以用于解决待修改区间\(K\)大的问题,当然也可以用 树套树------树状数组套可持久化线段树,但是 线段树套平衡树 更加容易理解,更加便于新手理解,所以一般也作为树套树的入门类别. 对于静态区间\(K\)大,我们可以用小巧精悍的主席树来做,也可以用强大无比的\(Splay\)来做.如果带修改,主席树就无能为力了,\(Splay\)也会变得很棘手难打…
1.简介 首先要知道什么是二叉查找树. 这是一棵二叉树,每个节点最多有一个左儿子,一个右儿子. 它能支持查找功能. 具体来说,每个儿子有一个权值,保证一个节点的左儿子权值小于这个节点,右儿子权值大于这个节点. 显然可以证明,这个树的中序遍历就是树上的序列从小到大排序后的结果. 我们插入一个值,就类似二分,从根往下找,直到进入一个空节点,然后插入. 查询的时候,比如查询前驱后继第k大等等,本质上都是通过比较左右儿子的权值/子树大小等来决策. 由于和节点的加入顺序有关, 所以,二叉查找树这样可以被轻…
可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建logn条链,会卡爆空间MLE) 主席树节点,维护father(是一个真实下标),维护dep(集合的最大深度), 一个关键函数是query,找到代表实际位置为pos的节点的编号 对于一个版本, 合并:先找到这个两个位置的集合的根节点. 不在同一个集合里的话,就合并. 合并的时候,新建一条链,并且更新…
讲一下另外的所有操作(指的是普通平衡树中的其他操作) 前一篇的学习笔记连接:[传送门],结尾会带上完整的代码. 操作1,pushup操作 之前学习过线段树,都知道子节点的信息需要更新到父亲节点上. 因为旋转之后有两个节点的儿子和两个节点的父亲被改变了,那么原来的总儿子个数也就是sz就被改变了. 那么我们需要维护sz,就需要pushup操作. 这个东西比较简单. void pushup(int nod) { tr[nod].sz = tr[tr[nod].ch[0]].sz + tr[tr[nod…