“把并查集用于上层算法时,先统计建集、合并与查找的总次数,再应用这一摊还分析界。定理中的 $m$ 已包含 $n$ 次建集,因而初始化的 $O(n)$ 时间也已计入。”
形式陈述
摊还分析对每一个合法操作序列
这里先固定允许的初态,例如空结构。
对
初态不统一或不是空结构时,
时,才能把差额吸收进总成本上界。对每条序列事后选择不同的
直觉
许多数据结构的操作成本高度不均:绝大多数操作便宜,偶尔一次重组极贵。逐次最坏界仍是合法上界,却可能过松,因为每次最坏状态无法连续发生。例如扩容一次后数组留下大量空位,下一次昂贵扩容必须等待许多追加。摊还分析利用的正是操作之间的这种约束。
记账法让便宜操作预付信用,势能法把尚可支付的工作量写成当前状态的函数。两者都必须保证不能透支:否则任意昂贵操作都能靠任意负余额伪装成便宜操作。信用与势只是证明中的量,实现无须真的维护一笔钱。整个论证对每一个合法序列成立,包括对抗性序列,不需要假定哪些操作更可能出现。
例子与边界
考虑容量满时翻倍的动态数组。从容量
例如追加到第 5 个元素时,搬迁发生在第 2、3、5 次追加,分别搬 1、2、4 个元素;加上五次新写入,总成本为 12。
若扩容每次只增加固定的一个位置,第
二进制计数器的势能逐步变化
从全零开始递增一个固定宽度的二进制计数器,以翻转一位计一个单位,取
例如 0111 → 1000 实际翻转四位,势从
带 multipop 的栈也可按同一原则计费:每个元素入栈时预付它唯一一次出栈的费用。关键不是某次能弹出多少元素,而是同一个已入栈元素不能在这条操作历史里被弹出两次。
边界在于摊还界的“总量”性质。摊还
推论与应用
摊还分析是许多经典结论的语言:动态数组的常数追加、并查集近乎常数的合并与查询、伸展树的对数摊还访问界、Fibonacci 堆各类操作的摊还界,以及垃圾回收、扫描线里“每个元素至多进出一次”式的论证。全局重建把昂贵重构记到账上,自调整结构让访问序列决定结构形状,并查集摊还界则展示多种启发式怎样共同产生反 Ackermann 总界;这些页面各自证明具体账本,本页不替它们展开。最具一般性的势能法见势能法条目,选择势函数的本质,是为“未来必然发生的工作”找到一个可守恒的量。
参考资料
-
Cornell University, CS 3110 Lecture 20: Amortized Analysis, Fall 2010,“Aggregate Method”与“Potential (Physicist’s) Method”:动态表的几何扩容及总成本账本。
-
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Ch. 16, aggregate, accounting, and potential methods。
-
Robert Sedgewick and Kevin Wayne, Algorithms, 4th ed., Addison-Wesley, 2011,§1.4, amortized cost in dynamic data structures。