Splay和LCT的複雜度分析

$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)$

相關文章
相關標籤/搜索