ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Treap

2022-08-10 23:01:02  阅读:155  来源: 互联网

标签:子树 Treap treap 插入 merge 常数 size


因为说太多遍了,所以打算直接写下来。

OI 中常用的平衡树有很多,但是论码量,一般大家也只会选 splay 或者 treap,但是这两个平衡树经常被说常数很大。

splay 的常数主要在维护它的结构上,信息合并上的常数还不错,也没啥好说的,这里就不提了。

这里说说 treap。

很多人说非旋 treap 常数很大,这是因为大家经常用一次 split 两次 merge 来搞一个插入,两次 split 一次 merge 搞一个删除,这就连树的路径都遍历了三遍,而且把平衡树的边各种修改,常数自然就上去了。

这里讲一个方法:
假设随机值是小根堆,对于插入,我们比较随机值,如果随机值比树根小,就把这个树按照插入权值 split 开,然后当成插入节点的两个儿子。
不然我们就根据权值比较,进入对应子树继续插入。

删除我们就找到这个节点,把两个儿子 merge 起来,连上去。

如果你学过旋 treap,这个是基本一样的。这样操作还提供了一些额外的性质:

距离叶子期望距离 \(O(1)\),我们这个节点的期望子树大小 \(O(\log_2 n)\)。

前者保证了我们 split, merge 时候的深度很小,是常数时间,瓶颈在于在上方路径的探查,而这一部分效率非常高。

后者则让我们可以用 treap 实现 平衡树套树,动态标号等功能。

然后没啥好说的了。

哦补个证明,只补插入的了。

对于你要插入的数,你先找到它在 treap 上二分出来的链。我们算每个位置停下的概率乘子树大小的和,就是期望子树大小。

在一个节点停下的概率不好算,但是它不大于在这个节点及上面停下的概率。
这个概率就是 \(\frac{1}{size+1}\),size 是子树大小。

然后就是 \(\sum size \times \frac{1}{size+1}\),就是深度,就是 \(O(\log_2 n)\)。

对于离叶子距离,大家感受一下,不会证(懒得扣细节,说不定不对都没数,但反正不超过期望子树大小的对数对吧)。

标签:子树,Treap,treap,插入,merge,常数,size
来源: https://www.cnblogs.com/skip1978/p/16574235.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有