【算法学习】有旋treap
2024-09-21 17:54:21
treap是平衡树的一种。与其他平衡树一样,它也能够支持插入和删除,求第k极值等,接下来我们主要探讨有旋treap的实现过程。
treap中每个节点要维护其值,左右孩子以及子树大小。父亲要不要写则看你的写法了,如果用的是指针或引用传入,则没有必要写。
特别的是,treap的每个节点还需要维护另一个值——它的优先度,优先度在节点新建时就赋值,并且在节点删除前不会改变。
treap的平衡性就取决于这个关键的值,这个值在一开始是随机赋值的,在建立平衡树时,还需要让结点的优先度有堆性质!
即意结点的原值要呈二叉排序树结构,而结点的“优先度”要满足父节点的优先度比两个儿子结点的优先度都要大!
也就是说treap既是一棵二叉排序树,还是一个堆【其实只是有堆性质,并不是严谨的堆的定义】!
这意味着当每个结点的优先度都不同时,这棵树只有一种排列方式满足它既是二叉排序树,也是堆(想一想为什么)。
而这种排列方式平均来说是平衡的,即它的树高正比于logn。这是因为优先度是随机赋值的,随机化思想给了它这个性质。
在修改时,不需要刻意维护平衡,只要当其堆性质被破坏,把它恢复就可以了。
====
接下来看具体实现过程:
我用的是指针+引用写法,目前写了插入,删除和查询某节点的排名。
接下来我们边看代码边分析:
namespace Treap{//我专门搞了个命名空间…… }
struct node{//这里是结点的结构体定义,要注意每个东西都要指针,因为这是指针写法 int val,pri,siz;//值,优先度和子树大小 node* son[];//孩子 node();//构造函数,定义在下面 }*null=new node,*root=new node;//空结点(null)和根结点(root) node::node(){son[]=son[]=null;}//在结构体外定义构造函数要加"::"
inline ]->siz+x->son[]->siz+;}//这个函数用于更新结点的子树大小
inline void rotate(node* &x,bool lr){//典型的平衡树旋转函数 //传进去的第一个是引用的节点指针,第二个表示左/右旋 //传指针不奇怪,传引用是为什么呢? //这是因为在旋转时把结点x和它的左/右孩子互换了位置,x原来的父亲现在的孩子指针要修改,可是我们没有父亲指针,所以传引用,在指针x的地址改变时,调用它时的传进去的父亲的孩子指针也会改变。 node *v=x->son[lr^],*vs=v->son[lr];//保存一下中间变量 x->son[lr^]=vs;//往一边旋,x的新“另一边”孩子就是x的原“另一边”孩子的“同一边”孩子 v->son[lr]=x;//而要旋转的另一个结点的孩子改变为x combine(x);combine(v);//重新计算siz x=v;//改变x的指针,指向子树的新根,这样可以使原父亲的孩子指针也变化 }
先写到这里……以后再补充
最新文章
- iframe关于滚动条的去除和保留
- POJ2186 Popular Cows [强连通分量|缩点]
- Hbase客户端API基础小结笔记(未完)
- ajax向前台输出二维数组 并解析
- 关于Java文件删除的操作
- Nessus漏洞扫描教程之配置Nessus
- 学习:WordXML格式初步分析
- uva11178 Morley’s Theorem(求三角形的角三分线围成三角形的点)
- CABasicAnimation 几种停止的回调
- UVA 571 Jugs ADD18 小白书10 数学Part1 专题
- 简单明了查看内存使用和ubuntu的版本号及位数
- 【Android Developers Training】 59. 管理图片存储
- js keys方法和foreach方法区别
- Mybatis 常用标签
- jQuery对象与DOM对象之间的转换(转)
- Python内置的urllib模块不支持https协议的解决办法
- 洛谷 P2812 校园网络【[USACO]Network of Schools加强版】 解题报告
- js基础-类型转换
- Round Numbers(数位DP)
- Spring Boot Application 事件和监听器
热门文章
- P2219 [HAOI2007]修筑绿化带
- C 输入 &; 输出——Day03
- P4433 [COCI2009-2010#1] ALADIN
- Spring点滴七:Spring中依赖注入(Dependency Injection:DI)
- 【bzoj4541】 Hnoi2016—矿区
- Java的I/O系统
- android:onClick=";xxx";
- mysql 统计 group by 之后的 group 的个数
- Discuz!论坛基本搭建
- Hadoop生态圈-hive五种数据格式比较