不论插入,删除还是访问,我们可以发现它们的复杂度都和操作的复杂度同阶,只是一点常数的区别
我们不妨假设有个点的,进行了次操作
采用势能分析
我们记,注意以为底和上取整
我们定义势能函数为
(记第次操作操作完之后,势能为)
只需要估计出的大小即可
(即初始势能和每次的势能变化量的和)
显然,
操作的具体定义为:
如果父节点是根,那么旋转一次
如果父节点和爷节点所处子树方向一致,那么先旋转父亲再旋转自己
否则,旋转两次自己
实际上可以归结于,,,,,操作
由于和是对称的操作
因此,只需要对,,操作分析复杂度即可

势能的变化量为

势能变化量为(缩小了常数的影响,但不能无视)
这是神仙复杂度证明中非常神奇的地方,通过一些有趣的性质,让常数项的代价合并到了势能的变化中
我们不妨设,那么注意到
由于$2w'(x) – w'(g) – w(x) = left lceil log_2 (a + b + 1)
ight
ceil – left lceil log_2 a
ight
ceil + left lceil log_2 a + b + 1
ight
ceil – left lceil log_2 b
ight
ceil $
注意到在上式中是对称的,不妨设
因此有,我们将中的放缩,可以得到

势能变化量为
由上文的结论,我们知道这里可以把放缩成
因此
把以上三种操作的势能全部放缩为
不妨假设一次,依次访问了点,最后会成为新的根
那么,最后的势能实际上是
因此,
即个点的,做次操作,复杂度为
不咕了….
的所有操作可以看做只有操作,其他都是常数
那么操作一共有两部分
-
在中走的复杂度
-
访问虚边的复杂度
首先是在中走的复杂度
定义,指的所有虚边和实边的子树大小的和
我们定义势能函数为
不妨设它依次访问了
那么,类似上文的复杂度分析,我们可以得到总的一次势能变化量为
这也就是的的性质
初始势能为,因此这一部分的复杂度为
访问虚边的复杂度
我们定义势能函数,为所有重虚边(儿子的子树大小大于等于自己的二分之一的虚边)的数量
那么,每次访问至多走条轻虚边,也就至多带来条重虚边,也就是以的代价增加的势能
而每次访问一条重虚边就需要付出的代价来减小的势能,并且访问完重虚边之后,不会有新的重虚边产生
因此,最终的复杂度是初始势能和势能变化量(实际操作的代价和势能变化量相同)的和,也就是
因此,的复杂度为











