Splay时间复杂度证明

高能预警! 需要前置知识“摊还分析”和“splay”

文章目录

    • 前置小结论
    • 一些约定
    • 各种情形下势函数变化量
      • zig/zag
      • zig-zig/zag-zag
      • zig-zag/zag-zig
    • 单次splay(以及插入/删除等操作)的摊还代价
    • 闲得蛋疼---卡评测机

前置小结论

log ⁡ x + log ⁡ y ≤ 2 l o g ( x + y ) − 2 \log x+\log y \le 2log (x+y)-2 logx+logy2log(x+y)2
容易看出这其实与 4 x y ≤ ( x + y ) 2 4xy\le (x+y)^2 4xy(x+y)2等价,即与 ( x − y ) 2 ≥ 0 (x-y)^2\ge0 (xy)20等价。

一些约定

对每个节点 x x x,设其大小为 c ( x ) c(x) c(x)(一个正数,此处取一即可),其子树的大小为 s ( x ) = ∑ u ∈ s u b t r e e ( x ) c ( u ) s(x)=\sum_{u\in subtree(x)}c(u) s(x)=usubtree(x)c(u),这个节点对势函数的贡献为 ϕ ( x ) = log ⁡ s ( x ) \phi(x)=\log s(x) ϕ(x)=logs(x)
定义整棵树的势函数 Φ ( T ) = ∑ x ∈ T ϕ ( x ) \Phi(T)=\sum_{x\in T} \phi(x) Φ(T)=xTϕ(x)。显然 Φ ( T ) > 0 \Phi(T)>0 Φ(T)>0

各种情形下势函数变化量

zig/zag

因为两种情况对称,所以图只画了 z i g zig zig情形

   Y        X'
 X  C  ->  A  Y'
A B          B C

Δ Φ = ϕ ( X ′ ) + ϕ ( Y ′ ) − ϕ ( X ) − ϕ ( Y ) = ϕ ( Y ′ ) − ϕ ( X ) ≤ ϕ ( X ′ ) − ϕ ( X ) ≤ 3 ( ϕ ( X ′ ) − ϕ ( X ) ) \begin{aligned}\Delta\Phi&=\phi(X')+\phi(Y')-\phi(X)-\phi(Y)\\ &=\phi(Y')-\phi(X)\\&\le\phi(X')-\phi(X)\\&\le3(\phi(X')-\phi(X))\end{aligned} ΔΦ=ϕ(X)+ϕ(Y)ϕ(X)ϕ(Y)=ϕ(Y)ϕ(X)ϕ(X)ϕ(X)3(ϕ(X)ϕ(X))

zig-zig/zag-zag

图还是照例只画一种……

     Z        X'
   Y  D      A  Y'
 X  C    ->    B  Z'
A B              C D

Δ Φ = ϕ ( Y ′ ) + ϕ ( Z ′ ) − ϕ ( X ) − ϕ ( Y ) \Delta\Phi=\phi(Y')+\phi(Z')-\phi(X)-\phi(Y) ΔΦ=ϕ(Y)+ϕ(Z)ϕ(X)ϕ(Y)
∵ s ( X ) + s ( Z ′ ) = s ( X ′ ) − c ( X ′ ) < s ( X ′ ) ∴ ϕ ( Z ′ ) < 2 ϕ ( X ′ ) − 2 − ϕ ( X ) ∴ Δ Φ < ϕ ( X ′ ) + ( 2 ϕ ( X ′ ) − 2 − ϕ ( X ) ) − ϕ ( X ) − ϕ ( X ) = 3 ( ϕ ( X ′ ) − ϕ ( X ) ) − 2 \because s(X)+s(Z')=s(X')-c(X')s(X)+s(Z)=s(X)c(X)<s(X)ϕ(Z)<2ϕ(X)2ϕ(X)ΔΦ<ϕ(X)+(2ϕ(X)2ϕ(X))ϕ(X)ϕ(X)=3(ϕ(X)ϕ(X))2

zig-zag/zag-zig

画两张图?不存在的……

     Z         X'
 Y      ->   Y'  Z'
A  X        A B C D
  B C

∵ s ( Y ′ ) + S ( Z ′ ) = s ( X ′ ) − c ( X ′ ) < s ( X ′ ) ∴ Δ Φ = ϕ ( Y ′ ) + ϕ ( Z ′ ) − ϕ ( X ) − ϕ ( Y ) < ( 2 ϕ ( X ′ ) − 2 ) − ϕ ( X ) − ϕ ( X ) < 3 ( ϕ ( X ′ ) − ϕ ( X ) ) − 2 \because s(Y')+S(Z')=s(X')-c(X')s(Y)+S(Z)=s(X)c(X)<s(X)ΔΦ=ϕ(Y)+ϕ(Z)ϕ(X)ϕ(Y)<(2ϕ(X)2)ϕ(X)ϕ(X)<3(ϕ(X)ϕ(X))2

单次splay(以及插入/删除等操作)的摊还代价

对于操作 s p l a y ( x ) splay(x) splay(x),把它拆成若干上述旋转,显然 Δ Φ < 3 ϕ ( r o o t ) − d e p ( x ) \Delta\Phi<3\phi(root)-dep(x) ΔΦ<3ϕ(root)dep(x)。而单次操作的实际代价可表示成 k i ∗ d e p ( x ) + c i k_i * dep(x)+c_i kidep(x)+ci

所以,使用套路,将势函数乘上 k = max ⁡ { k i } k=\max\{k_i\} k=max{ki},这样单次操作的摊还代价为 Δ Φ + k i ∗ d e p ( x ) + c i < 3 k ϕ ( r o o t ) − k ∗ d e p ( x ) + k i ∗ d e p ( x ) + c i = O ( 3 k log ⁡ s ( r o o t ) ) = O ( log ⁡ s ( r o o t ) ) \Delta\Phi+k_i * dep(x)+c_i\\<3k\phi(root)-k*dep(x)+k_i * dep(x)+c_i\\=O(3k\log s(root))=O(\log s(root)) ΔΦ+kidep(x)+ci<3kϕ(root)kdep(x)+kidep(x)+ci=O(3klogs(root))=O(logs(root))

c i = 1 c_i=1 ci=1,设总结点数为 n n n,得到最终摊还代价 O ( log ⁡ n ) O(\log n) O(logn)。自带一个 2 ∼ 3 2\sim 3 23的常数。

闲得蛋疼—卡评测机

实测 L u o g u Luogu Luogu模板文艺平衡树有 % 50 \%50 %50的数据满足总旋转次数 ≤ 2.6 × n log ⁡ n \le 2.6\times n\log n 2.6×nlogn
% 100 \%100 %100的数据满足总旋转次数 ≤ 2.73 × n log ⁡ n \le 2.73\times n\log n 2.73×nlogn

你可能感兴趣的:(模板,splay)