如何证明treap数插入的期望旋转次数小于2

来源:互联网 发布:如何防止网络麻将开挂 编辑:程序博客网 时间:2024/05/22 08:03

介绍

树堆,在数据结构中也称Treap,是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树。其基本操作的期望时间复杂度为O(logn)。

对于插入

给节点随机分配一个优先级,先和二叉排序树的插入一样,先把要插入的点插入到一个叶子上,然后跟维护堆一样,如果当前节点的优先级比父亲大就旋转,如果当前节点是父亲的左儿子就右旋,如果当前节点是父亲的右儿子就左旋。

证明

在这里我们先假设优先级的分布是稠密的。
如果不是稠密的,可以通过映射来构造一个稠密的分布:
把优先级从小到大排序,然后把优先级直接用序号代替。这样就得到了一个稠密的分布
设我们要插入的节点的优先级为X,treap里面最大的优先级为Limit,简称L
首先,如果XL,那么就不用旋转。
所以我们讨论XL 的情况

我们可以得到树高

Highlog2L

而我们的X 的目标树高为
aimHighlog2X

每次旋转,X都会减少一层树高(升上去了)
所以我们的旋转次数
Spin=HighaimHighlog2Llog2X

由于我们的X是在[0,L] 内等可能的
那么期望旋转次数为加权平均数
X=0L1L(log2Llog2X)


1LL0(log2Llog2X)dX

=1Lln2[lnLxlnXX+X]L0

=1ln20=1.44

证明完毕.