Treap
Contents
介绍
Treap是一个自平衡的 BST (Binary Search Tree)。与普通BST不同的在于,每个节点会有一个随机的优先级 (priority/rank),在不破坏 BST 的性质的情况下,保证了每一个子树根据 优先级 形成一个最小堆。
这样,Treap的所有操作均为 $O(\log n)$。
Treap支持的操作有:
- 插入
- 删除
- 根据值查询排名
- 根据排名查询值
- 查询第一个值比 val 小的节点
- 查询第一个值比 val 大的节点
结构/操作
需要同时维护 BST 和 最小堆的性质,我们利用旋转来维护这个性质。
所以为了维护最小堆性质,只要对于一个节点 $u$,在插入节点后,判断插入左/右的 priority 是否比它小,如果是,将最小priority的那个旋转上来。
性质
-
Treap 相当于将所有值赋上随机的 priority 后,按照priority从小到大的顺序插入进一个普通的 BST 中。
-
$\forall i \neq k, i ↑ k \iff p_i = \min(\{p_i, p_{i+1}, … p_k\})$
这里 $i ↑ k$ 的意思是 $i$ 是 $k$ 的祖先。我们这里假设 $\forall i$,第 $i$ 个节点有整个 treap 中第 $i$ 大的val,$p_i$ 代表了 $i$ 的 priority(这里 WLOG 假设了 $i<k$)。
证明:
考虑当前子树中:
Case1: $i$ 为 $k$ 的祖先,这很明显说明 $i$ 在这个子树内的priority是最小的,反之亦然。
Case2: $j$ 为 $k$ 的祖先,$j \neq i, j \neq k$,并且 $i,k$ 在不同的子树中,那么条件不成立。
Case3: $j$ 为 $k$ 的祖先,$j \neq i, j \neq k$,并且 $i,k$ 在相同的子树中,那么则可以递归解决。
-
$\Pr(i ↑ k) = \frac{1}{|i-k|+1}, i \neq k$
证明:由性质 $2$,可以得知因为所有的priority均为随机,所以 $p_i$ 成为最小值的概率为 $\frac{1}{|i-k|+1}$
-
$E[depth(k)] = \sum\limits_{i=1}^n \Pr(i ↑ k) = O(\log n)$。
这也解释了为什么 Treap 的复杂度是 $O(\log n)$。