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的指针,指向子树的新根,这样可以使原父亲的孩子指针也变化
 }

先写到这里……以后再补充

【算法学习】有旋treap的更多相关文章

  1. 浅谈无旋treap(fhq_treap)

    一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...

  2. [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec  Mem ...

  3. [您有新的未分配科技点] 无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MB Description Input 输入的第1 行包含两个数N 和M(M ≤20 ...

  4. 【算法学习】Fhq-Treap(无旋Treap)

    Treap——大名鼎鼎的随机二叉查找树,以优异的性能和简单的实现在OIer们中广泛流传. 这篇blog介绍一种不需要旋转操作来维护的Treap,即无旋Treap,也称Fhq-Treap. 它的巧妙之处 ...

  5. [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...

  6. [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...

  7. [Bzoj3224][Tyvj1728] 普通平衡树(splay/无旋Treap)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 平衡树入门题,学习学习. splay(学习yyb巨佬) #include<b ...

  8. 非旋Treap及其可持久化

    平衡树这种东西,我只会splay.splay比较好理解,并且好打,操作方便. 我以前学过SBT,但并不是很理解,所以就忘了怎么打了. 许多用平衡树的问题其实可以用线段树来解决,我们真正打平衡树的时候一 ...

  9. 「学习笔记」Treap

    「学习笔记」Treap 前言 什么是 Treap ? 二叉搜索树 (Binary Search Tree/Binary Sort Tree/BST) 基础定义 查找元素 插入元素 删除元素 查找后继 ...

随机推荐

  1. BZOJ3142 HNOI2013数列(组合数学)

    考虑差分序列.每个差分序列的贡献是n-差分序列的和,即枚举首项.将式子拆开即可得到n*mk-1-Σi*cnt(i),cnt(i)为i在所有差分序列中的出现次数之和.显然每一个数出现次数是相同的,所以c ...

  2. [LOJ3049] [十二省联考 2019] 字符串问题

    题目链接 LOJ:https://loj.ac/problem/3049 洛谷:https://www.luogu.org/problemnew/show/P5284 BZOJ:https://www ...

  3. huhamhire-hosts — Hosts文件自动配置工具

    https://www.anotherhome.net/1376 推荐配合EasyGoAgent使用: EasyGoAgent — 开箱即用的GoAgent Update 2015.5.15 数据文件 ...

  4. 【BZOJ1048】分割矩阵(记忆化搜索,动态规划)

    [BZOJ1048]分割矩阵(记忆化搜索,动态规划) 题面 BZOJ 洛谷 题解 一个很简单的\(dp\),写成记忆化搜索的形式的挺不错的. #include<iostream> #inc ...

  5. 数据挖掘领域经典分类算法 —— C4.5算法(附python实现代码)

    目录 理论介绍 什么是分类 分类的步骤 什么是决策树 决策树归纳 信息增益 相关理论基础 计算公式 ID3 C4.5 python实现 参考资料 理论介绍 什么是分类 分类属于机器学习中监督学习的一种 ...

  6. 【bzoj3527】 Zjoi2014—力

    http://www.lydsy.com/JudgeOnline/problem.php?id=3527 (题目链接) 题意 $${F_i=\sum_{j<i} {\frac{q_iq_j}{( ...

  7. 所以到底什么是 Growth Hacking?

    Growth hacking 在硅谷的确是有快被用坏的趋势,之所以在大陆的互联网创业圈里还没有普及开来,我想一个是由于这个词并没有对应的中文解释,没有一个能够找到一个相对完美的解释,就像 “hack” ...

  8. Java入门:Java中获取键盘输入值的三种方法

    Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代 ...

  9. Rancher Server HA的高可用部署实验-学习笔记

    转载于https://blog.csdn.net/csdn_duomaomao/article/details/78771731 Rancher Server HA的高可用部署实验-学习笔记 一.机器 ...

  10. Zabbix应用四:Zabbix监控Nginx

    利用Zabbix监控Nginx 一.准备nginx监控模版: 1.1.下载nginx监控模版:  点此下载 1.2.导入模版: Zabbix管理页面,选择'配置'->'模版'->'导入': ...