$Splay$的複雜度分析
不論插入,刪除仍是訪問,咱們能夠發現它們的複雜度都和$splay$操做的複雜度同階,只是一點常數的區別函數
咱們不妨假設有$n$個點的$splay$,進行了$m$次$splay$操做spa
採用勢能分析3d
咱們記$w(x) = \left \lceil \log_2 (size(x)) \right \rceil$,注意以$2$爲底和上取整blog
咱們定義勢能函數爲$\varphi = \sum w(x)$class
(記第$i$次操做操做完以後,勢能爲$\varphi(i)$)im
只須要估計出$\varphi(m) - \varphi(m - 1) + \varphi(m - 1) - \varphi(m - 2) ... + \varphi(1) - \varphi(0) + \varphi(0)$的大小便可img
(即初始勢能和每次的勢能變化量的和)di
顯然,$\varphi(0) \leqslant n \log n$ant
$splay$操做的具體定義爲:co
若是父節點是根,那麼旋轉一次
若是父節點和爺節點所處子樹方向一致,那麼先旋轉父親再旋轉本身
不然,旋轉兩次本身
實際上能夠歸結於$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) \right \rceil - \left \lceil \log_2 a \right \rceil + \left \lceil \log_2 a + b + 1 \right \rceil - \left \lceil \log_2 b \right \rceil $
注意到$a, b$在上式中是對稱的,不妨設$a \geq b$
$\geq \left \lceil \log_2 (a + b + 1) \right \rceil - \left \lceil \log_2 b \right \rceil \geq \left \lceil \log_2 (2b + 1) \right \rceil - \left \lceil \log_2 b \right \rceil \geq \left \lceil \log_2 b \right \rceil + 1 - \left \lceil \log_2 b \right \rceil \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)) + 1\leq 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$的複雜度分析
不咕了....
$LCT$的全部操做能夠看作只有$access$操做,其餘都是常數
那麼$access$操做一共有兩部分
-
在$splay$中走的複雜度
-
訪問虛邊的複雜度
首先是在$splay$中走的複雜度
定義$w(x) = \left \lceil \log_2 (size(x)) \right \rceil$,$size(x)$指$x$的全部虛邊和實邊的子樹大小的和
咱們定義勢能函數爲$\varphi = \sum w(x)$
不妨設它依次訪問了$x_1, x_2 ..., x_p$
那麼,相似上文$splay$的複雜度分析,咱們能夠獲得總的一次勢能變化量爲$-w(x_1) +w(x_2) - w(x_2) + w(x_3) ... +w(x_p) + 1\leq w(x_p) + 1 = O(\log n)$
這也就是$splay$的$finger-search$的性質
初始勢能爲$n \log n$,所以這一部分的複雜度爲$O(n\log n + m \log n)$
訪問虛邊的複雜度
咱們定義勢能函數$\phi$,爲全部重虛邊(兒子的子樹大小大於等於本身的二分之一的虛邊)的數量
那麼,每次訪問至多走$\log$條輕虛邊,也就至多帶來$\log$條重虛邊,也就是以$O(\log)$的代價增長$\log$的勢能
而每次訪問一條重虛邊就須要付出$O(1)$的代價來減少$1$的勢能,而且訪問完重虛邊以後,不會有新的重虛邊產生
所以,最終的複雜度是初始勢能和勢能變化量(實際操做的代價和勢能變化量相同)的和,也就是$O(n + m \log n)$
所以,$LCT$的複雜度爲$O(n \log n + m \log n)$