0%

SBT的时间/空间复杂度证明

1.对于SBT树高log n的证明

设 f[x] 是高度为 x 的结点个数最少的 SBT 的结点个数。

f[x]有一个结论如下:

$\sf f[x]=\begin{cases}1,(x=0)\2,(x=1)\f[x-1]+f[x-2]+1,(x>1)\end{cases}$

显然,f[0]=1,f[1]=2;

f[x]=f[x-1]+f[x-2]+1(x>1)的证明:

对于每个x,设 t 指向一个高度为 x 的 SBT ,然后这个 SBT 包含一个高度为 x-1 的子树。不妨设它就是左子树。

通过前面对于 f[x] 的定义,我们得到t[ls(x)].siz>=f[x-1],并且在左子树上有一棵高为 x-2 的子树,或者说有一棵大小( siz )至少为 f[x-1] 的子树在左子树上。由性质可得t[ls(x)].siz>=f[x-2]。

故而有f[x]=f[x-1]+f[x-2]+1(x>1)。

也可以通过构造特殊SBT进行证明:

对于递推函数f,我们发现它具有斐波那契数列的相似性质,则利用特征根方程可以求出通项公式:

$\sf\Large f[x]=\frac{u^{x+3}-v^{x+3}}{\sqrt5}-1=||\frac{u^{x+3}}{\sqrt 5}-1||$

其中u=$\frac{1+\sqrt{5}}{2}$,v=$\frac{1-\sqrt{5}}{2}$。

下面是一张计算表,可以看见f[x]较小的值

那么接下来对于最差高度maxh进行证明(引自论文):

可得最差树高是log n级别的。

2.对于SBT maintain()时间复杂度O(1)的证明

通过前面的结论,我们可以很容易的证明 Maintain 过程是非常有效的 过程 。

评价一棵 BST 时有一个非常重要的值,那就是 结点的平均深度。它是通过所有结点深度和除以总结点个数 n 获得的。通常它会很小,而 BST 会更小 。

因为对于每个常数 n ,我们都期望结点深度和 (缩写为 SD ) 尽可能的小。

现在我们的目的是削减结点深度和,而它就是用来约束 Maintain 的次数。

回顾一下 Maintain 中执行旋转的条件,会发现结点深度和在旋转后总是在减小

感性分析后,再进行理性证明(引自论文):

可见maintain()函数均摊只有O(1),非常快速。

3.SBT综合性能分析

一张图说明效率:

两张表对比速度:

这说明SBT在时间复杂度上胜于一般的平衡树。

另外,不像一般平衡树,SBT只用维护一个额外的siz值即可,而siz值往往又是题目中要求的,所以可以视作不存储额外信息。而treap等则需要另外存储随机权值,颜色等等,空间上SBT也略胜一筹。

总结而言……SBT天下第一!