概念与基本性质
Treap = Tree + Heap,即是一棵同时满足二叉搜索树和堆性质的二叉树
Treap 有一个随机附加域满足堆的性质,其结构相当于以随机数据插入的二叉搜索树
其基本操作的期望时间复杂度为 O(log n)
相对于其他的平衡二叉搜索树,Treap的特点是实现简单,且能基本实现随机平衡的结构。
基本操作
- 插入和删除
- 访问某位置
- 查询某数所在的位置
实现方法
本题目的是构造名次树来维护一个有序序列
为了在保证堆的性质的同时进行如上操作,我们引入下列函数:1
2cut(u, k) //将以 u 为根节点的子树在第 k 个节点后切开,并返回切开后两树根节点。
merge(l, r) //在维护堆性质的同时将的两棵 Treap 合并为一棵,并返回合并后的根节点。
每次cut的位置大概如下:
具体操作
插入 - insert = cut + merge + merge
删除 - delete = split + split + merge ? O(log n)
排名查询/数值查询 - search :通过二叉排序树的性质进行查找
前驱 - last:将所有比 x 小的数切下,找到其中最大的数后,再合并
后继 - next:将所有比 x 小的数(包括)切下,在剩下的树中找出最小的数后,再合并
代码
1 |
|