Splay时间复杂度证明

    技术2022-07-10  157

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

    文章目录

    前置小结论一些约定各种情形下势函数变化量zig/zagzig-zig/zag-zagzig-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')\\ \therefore \phi(Z')<2\phi(X')-2-\phi(X)\\ \therefore\Delta\Phi<\phi(X')+(2\phi(X')-2-\phi(X))-\phi(X)-\phi(X)=3(\phi(X')-\phi(X))-2 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(X')\\ \begin{aligned}\therefore\Delta\Phi&=\phi(Y')+\phi(Z')-\phi(X)-\phi(Y)\\ &< (2\phi(X')-2)-\phi(X)-\phi(X)\\ &<3(\phi(X')-\phi(X))-2 \end{aligned} 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 \P %50的数据满足总旋转次数 ≤ 2.6 × n log ⁡ n \le 2.6\times n\log n 2.6×nlogn % 100 \0 %100的数据满足总旋转次数 ≤ 2.73 × n log ⁡ n \le 2.73\times n\log n 2.73×nlogn

    Processed: 0.017, SQL: 9