Splay和LCT的复杂度分析

Posted reverymoon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Splay和LCT的复杂度分析相关的知识,希望对你有一定的参考价值。

(Splay)的复杂度分析

不论插入,删除还是访问,我们可以发现它们的复杂度都和(splay)操作的复杂度同阶,只是一点常数的区别

我们不妨假设有(n)个点的(splay),进行了(m)(splay)操作


采用势能分析

我们记(w(x) = left lceil log_2 (size(x)) ight ceil),注意以(2)为底和上取整

我们定义势能函数为(varphi = sum w(x))

(记第(i)次操作操作完之后,势能为(varphi(i))

只需要估计出(varphi(m) - varphi(m - 1) + varphi(m - 1) - varphi(m - 2) ... + varphi(1) - varphi(0) + varphi(0))的大小即可

(即初始势能和每次的势能变化量的和)

显然,(varphi(0) leqslant n log n)


(splay)操作的具体定义为:

如果父节点是根,那么旋转一次

如果父节点和爷节点所处子树方向一致,那么先旋转父亲再旋转自己

否则,旋转两次自己

实际上可以归结于(zig)(zag)(zig-zig)(zag-zag)(zig-zag)(zag-zig)操作

由于(zig)(zag)是对称的操作

因此,只需要对(zig)(zig-zig)(zig-zag)操作分析复杂度即可


(zig)操作

技术分享图片

势能的变化量为(1 + w'(x) + w'(fa) - w(x) - w(fa) leq 1 + w'(fa) - w(x) leq 1 + w'(x) - w(x))


(zig-zig)操作

技术分享图片

势能变化量为(1 + w'(x) + w'(fa) + w'(g) - w(x) - w(fa) - w(g))(缩小了常数的影响,但不能无视)

(leq 1 + w'(fa) + w'(g) - w(x) - w(fa) leq 1 + w'(x) + w'(g) - 2w(x))

这是神仙复杂度证明中非常神奇的地方,通过一些有趣的性质,让常数项的代价合并到了势能的变化中

我们不妨设(a = w'(g), b = w(x)),那么注意到(w'(x) = a + b + 1)

由于$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 $

注意到(a, b)在上式中是对称的,不妨设(a geq b)

(geq left lceil log_2 (a + b + 1) ight ceil - left lceil log_2 b ight ceil geq left lceil log_2 (2b + 1) ight ceil - left lceil log_2 b ight ceil geq left lceil log_2 b ight ceil + 1 - left lceil log_2 b ight ceil geq 1)

因此有(1 leq 2w'(x) - w'(g) - w(x)),我们将(1 + w'(x) + w'(g) - 2w(x))中的(1)放缩,可以得到

(leq 3(w'(x) - w(x)))


(zig-zag)操作

技术分享图片

势能变化量为(1 + w'(x) + w'(fa) + w'(g) - w(x) - w(fa) - w(g) leq 1 + w'(fa) + w'(g) - w(x) - w(fa) leq 1 + w'(g) + w'(fa) - 2w(x))

由上文的结论,我们知道这里可以把(1)放缩成(1 leq 2w'(x) - w'(g) - w'(fa))

因此(leq 2(w'(x) - w(x)))


把以上三种操作的势能全部放缩为(leq 3(w'(x) - w(x)))

不妨假设(splay)一次,依次访问了点(x_1, x_2 ... x_n),最后(x_1)会成为新的根

那么,最后的势能实际上是(3(w'(x_1) - w(x_1) + w''(x_1) - w'(x_1) + .... + w(n) - w^{'''.....}(x_1)) + 1 = 3 * (w(n) - w(x_1)) + 1leq log_2 n)

因此,(varphi(m) - varphi(m - 1) + varphi(m - 1) - varphi(m - 2) ... + varphi(1) - varphi(0) + varphi(0) = n log n + m log n)

(n)个点的(splay),做(m)(splay)操作,复杂度为(O(n log n + m log n))


(LCT)的复杂度分析

先让我咕一会

以上是关于Splay和LCT的复杂度分析的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P4219 [BJOI2014]大融合(LCT,Splay)

芝士:LCT

Splay树分析

Splay

LCT总结

Splay Tree