1. Splay 摊还分析的势能函数中为什么以子树大小对数为势能可导出 O(log n) 均摊界?
为什么 Splay 的势能分析以"每棵子树大小的对数之和"为势能函数,就能导出 O(log n) 的均摊界?
- 势能函数 Φ = Σ log(size(x))
- 旋转时势能变化与子树大小对数的关系
- 均摊界推导
势能函数取 Φ = Σ log s(x)(s(x) 为节点 x 的子树大小)。理由:splay 把被访问节点 x 从深层移到根,它会经过一系列旋转;每次双旋的势能变化恰好能被子树大小对数的增量控制,即摊还代价 ≤ 3(log s'(x) − log s(x)),其中 s'(x) 是旋转后 x 的子树大小。由于 x 最后到根,s'(x)=n,整个 splay 的累计摊还代价 ≤ 3 log n + O(1),即 O(log n)。选择对数是因为它把"子树大小变化"与"到根距离"联系起来,且满足对数不等式使中间项对消,从而能得到紧的界。
势能函数必须"旋转后势能增加可控、且能覆盖旋转成本"。子树大小对数兼具两点:旋转使 x 的子树变大(势能增加),但要证明增加量不超过 log 差的倍数;同时初始和最终势能差有界(≤ n log n)。对数函数让"乘法/加法"的 size 变化转化为"加法"的势能变化,是得到 O(log n) 摊还界的关键选择。