平摊分析

维基百科,自由的百科全书
跳转至: 导航搜索

计算机科学中,特别是算法分析中,平摊分析寻找在最坏情况下的操作序列中每操作的平均耗费时间。平摊分析只保证最坏情况性能的每操作耗费时间,不涉及平均情况性能。

这个方法需要知道操作序列中可能发生的每个操作。通常应用在操作间存在状态的数据结构中。基本思想是一个最坏情况操作会改变状态从而不会在一段时间内再次出现,因此"平摊"它的耗费。

一个简单的例子,在某个特定实现的动态数组中,我们在每次数组溢出时增长数组的长度至原来的两倍。因此需要数组空间分配,在最坏情况下一个插入操作需要O(n)的时间。但是,一个 n 个插入的操作序列仍然可以在 O(n) 的时间内完成,因为剩下的插入可以在常数时间内完成,因此 n 个插入可以在 O(n) 的时间内完成。因此每操作的平摊耗费为O(n) / n = O(1)。

注意平摊分析与平均时间分析和概率算法的概率分析不同。在平均时间分析中,我们平均化所有可能的输入; 在概率算法的概率分析中,我们平均化所有可能的随机选择;在平摊分析中,我们平均化一系列操作的耗费。平摊分析假设的是最坏情况输入并且通常不运行随机选择。

平摊分析中几种常用的技术:

  • 聚合分析决定 n 个操作序列的耗费上界 T(n),然后计算平均耗费为 T(n) / n
  • 记账方法确定每个操作的耗费,结合它的直接执行时间及它在对运行时中未来操作的影响。通常来说,许多短操作增量累加成"债",而通过减少长操作的次数来"偿还"。
  • 势能方法类似记账方法,但通过预先储蓄"势能"而在需要的时候释放。