平衡树treap 0基础详解
刚开始学treap。。同学在台上给我们讲,貌似除我之外的机房dalao们都听懂了就我发呆。。。(滑稽)
于是,事后的窝只能自己上网翻书研究了。。。。
treap:
treap=tree+heap,树+堆
也就是说,这个东西是个树,但是满足堆的性质。
前置知识:
BST二叉搜索树:
度娘曰:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
也就是说,你把它从根节点中序遍历一边就能得到一个从小到大的数列。
大概长这样子:

对于4:左边子树节点的权值为0 1 2 3,都比4小,右边子树节点的权值为5 6 7,都比4大。
对于1:左边子树节点权值为0,比1小,右边子树节点权值为2 3,比1大(且比4小)。
对于其他节点同理。
一个不难理解的东西。
堆:
priority_queue。。。
堆中某个节点的值总是不大于或不小于其父节点的值;
这里就不再手写堆了,‘’
回过头来:
根据BST的定义我们可以知道,任意选取一个数做为根节点,在整个数列中一定能找到比他小的数和比他大的数(或者其中一个不存在),同样的,对于它的子树也是根节点不确定的。
有些毒瘤! 出题人会拿duliu数据把BST卡成一条链,然后多次询问,复杂度直接爆炸。
那么为了均摊一下BST的深度,使得每次询问时间复杂度都接近logn的话,我们需要对它进行一系列操作:
赋权值:
我们随机为每一个节点赋值一个权值pri,对于pri我们要求pri低的深度小,也就是小根堆的性质,因为rand每次都随机的话是可以均摊一下节点的深度(具体的原理我还一时半会说不清。。感性李姐)
如何调整节点使得其满足堆序:
在节点插入时,和bst一样建立,找到自己节点应该在的位置,当当前节点为空时,建立新节点,rand它的pri后返回,对其进行左右旋转操作。
左旋:就是把根节点转移到其左子节点的位置,并维护BST。
方法:直接上图:

我们可以按照红线的方法来划分子树;
这样就是上面的一条链和下面的又子节点的子树两部分了。

旋转后,绿色节点到达根节点位置,也就是把整条链往左拽了一下;子树换了父亲,认左边的节点为爸爸了:

就这样完了。
右旋:换个方向搞左旋。
删除节点:
删除时,如果该节点对应size>1,则size--,否则将其权值pri赋为inf或者清空。之后我们可以通过比较左右子树pri的大小决定谁做新的根(为了满足堆的性质,单数不管是左子树根节点还是右子树根节点做新的根,都不会影响BST性质,感性模拟),之后根节点就变成了原来左子树/右子树中的一员,继续递归下去,直到成为叶节点,也就是这一段开头说的那句话的情况。之后我们就可以直接删除它了。
求前驱后继:
一个数x的前驱定义为小于这个数的最大的数。后继就是大于等于这个数的最小的数。
理解如何递归:
以前驱举例子,因为要找小于这个数的最大的数,那么肯定到左子树去找;
如果当前节点大于等于根节点的值,到左子树里面找;
如果当前节点空的,返回inf,
else,如果当前节点的val<x 则返回max(v,去右子树递归的返回值);
else,说明答案还在左子树里面,那么就到左子树去找。
原理基本讲解完毕。
学会的人去切:https://www.luogu.com.cn/problem/P3369
完结、
平衡树treap 0基础详解的更多相关文章
- Dom探索之基础详解
认识DOM DOM级别 注::DOM 0级标准实际并不存在,只是历史坐标系的一个参照点而已,具体的说,它指IE4.0和Netscape Navigator4.0最初支持的DHTML. 节点类型 注:1 ...
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- javaScript基础详解(1)
javaScript基础详解 首先讲javaScript的摆放位置:<script> 与 </script> 可以放在head和body之间,也可以body中或者head中 J ...
- Python学习一:序列基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- 深入浅出DOM基础——《DOM探索之基础详解篇》学习笔记
来源于:https://github.com/jawil/blog/issues/9 之前通过深入学习DOM的相关知识,看了慕课网DOM探索之基础详解篇这个视频(在最近看第三遍的时候,准备记录一点东西 ...
- 三剑客基础详解(grep、sed、awk)
目录 三剑客基础详解 三剑客之grep详解 1.通配符 2.基础正则 3.grep 讲解 4.拓展正则 5.POSIX字符类 三剑客之sed讲解 1.sed的执行流程 2.语法格式 三剑客之Awk 1 ...
- Vue1.0用法详解
Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8 不能实现的 ECMAScript 5 特性. 开发环境部署 可参考使用 vue+webpack. 基本用法 1 2 3 ...
- Android消息传递之EventBus 3.0使用详解
前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...
随机推荐
- Had I not seen the Sun(如果我不曾见过太阳)
Had I not seen the Sun by Emily Dickinson Had I not seen the Sun I could have borne the shade But Li ...
- C#开发者必须知道的13件事情
1.开发流程 程序的Bug与瑕疵往往出现于开发流程当中.只要对工具善加利用,就有助于在你发布程序之前便将问题发现,或避开这些问题. 标准化代码书写 标准化代码书写可以使代码更加易于维护,尤其是在代码由 ...
- 关于element中的父子组件的传值问题
首先讲一下父子组件的传值问题. 这是大家很熟悉的一张图,讲述了父子组件传值的过程.父组件通过prop传值给子组件,子组件通过$emit给父组件发送消息来使父组件的prop发生变化.这都是老生常谈了.下 ...
- appium+python教程1
Python3+Appium安装使用教程 一.安装 我们知道selenium是桌面浏览器自动化操作工具(Web Browser Automation) appium是继承selenium自动化思想旨在 ...
- Django 实现登录后跳转
说明 实现网页登录后跳转应该分为两类:即登录成功后跳转和登录失败再次登录成功后跳转.参考网上内容,基本都只实现了第一类.而没有实现第二类. 实现 为了能让登录失败后再次登录成功后还能实现跳转.我这里采 ...
- 最长回文 HDU - 3068(马拉车算法)
Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入 ...
- Laravel 最佳实践
单一职责原则 一个类和一个方法应该只有一个责任. 例如: public function getFullNameAttribute() { if (auth()->user() &&am ...
- 计算机基础与python安装
计算机基础 内容详细: 一.计算机基础 1. 计算机什么组成的 输入输出设备 cpu 硬盘 内存 中央处理器 处理各种数据 相当于人的大脑 内存 存储数据 硬盘 存储数据的 2. 什么是操作系统 控制 ...
- 以前面试 经常写这种 问掉的 copy 还是 =
get的时候,生成的 那个对象赋值给aa 生成的对象在这条语句完 就析构了: https://blog.csdn.net/qq_31759205/article/details/80544468h ...
- Java浅拷贝与深拷贝(思维导图)
图1 拷贝思维导图(点击查看图片) 1,拷贝 有两个相同属性的对象A和B,A拥有初始化值,将其值拷贝到B中,使得B拥有与A“相同”数据的属性!注意这里的相同我有加双引号! 相同可能表示这么几个意思:① ...