原文链接www.cnblogs.com/zhouzhendong/p/JunTanFenXi.html
本文概要
1. 引入
2. 简单例子
3. 证明 splay 复杂度
4. 证明 LCT 复杂度
引入
为什么 KMP 不能可持久化,而要用 KMP 自动机来代替?
为什么 splay 不能可持久化,仅仅只是因为难以维护 father 指针吗?
答案是——它们都是基于均摊分析的。
均摊是什么?
这里有一个容易混淆的概念:期望。
期望是指在随机情况下,算法的每种时间复杂度乘上它发生的概率之和。
而均摊不一样。它是指总复杂度在一个范围内,但是单次操作的复杂度并不是总复杂度除以操作数,甚至有可能接近总复杂度。
本文主要部分参照陈胤伯的《均摊分析简介》改写。
简单例子
问题
一个初始值为 0 的 k 位二进制计数器,每次加一。每次加一的运算次数为修改的位数。请问时间复杂度是什么?
证明与答案
作为一个简单例子,自然有很多简单证法。
例如,这个 k 位二进制数第 i 位,需要每加 $2^i$ 次才会变一次。所以所有位的变化次数之和为
$$\sum_i \frac{n}{2^i} = O(n)$$
所以单词操作均摊 $O(1)$ 。
接下来,引入一种更通用的方法——势能分析。
定义势能函数 $\phi$ 表示定义域当前状态的一个函数。
定义 $\phi(i)$ 为第 i 次操作后的状态的势能函数值。
定义第 i 次操作的实际消耗时间为 $t_i$ 。