看数据结构的时候,书里面说对于随机输入的序列,BST的期望深度是log(n),当时没当一回事(其实是证明看不懂),这两天复习二叉搜索树遇到树堆(treap)又回去翻了一下证明过程,其实还蛮简单的。
总结起来也就一句话:
只要保证BST的任意子树的根节点选取是随机的,那么这颗树的期望深度就必然是log(n).
证明如下:
1.首先要定义一个概念——内部路径长(D(N)),也就是一个树内每个节点的深度和,平均一下也就得到了一棵树的期望深度。
D(N) = D(M) - D(N-M-1) + N-1 一颗树的路径长 = 左子树的路径长 + 右子树的路径长 + N-1 (子树的节点个数)
假如 M 取任意值的概率一样(1/N),那么有:
这个通项公式最终规模是D(N) = O(NlogN)的。
2.对于随机输入的数据,任意值为根的概率是一样的。
(1)排在第一位的值必然为根,由于输入数据随机,那么为排在第一的数自然是随机的。
3.treap树
我们知道优先级最小的数据必然是根(堆序性),并且treap的优先级是随机给予的,那么一个数有最小优先级的概率自然是相等的,那么自然的,任一值被选取为根的概率是相同的,自然treap树的平均深度为logN。