由来
之前的简单分析可能会对算法复杂度的上界作出过大的估计。例如,有一个空栈,连续对它进行n次操作(push,pop,连续pop),那么它的时间复杂度的上界是多少?简单的分析可以给出 O(n2) 的上界,理由如下:
最坏情况下,每次操作取三种操作中上界最大者连续pop的上界 O(n) ,那么n次操作的上界显然搜索 O(n2) 。
这个分析没有错,但是上界还可以进一步收缩。因为在一个栈中,pop的次数取决于栈中的元素个数,一个栈是不能一直pop下去的,如果栈有n个元素,那么pop的次数是不能超过插入的次数的,也就是:
num(push)≥num(pop+multipop)
也就是说,总时间约为插入次数n的两倍,这说明时间复杂度上界是 O(n) 。由此,引出了平摊分析(Amortized Analysis)的概念。
平摊分析
平摊分析是一种分析方法,其核心思想是:在进行一系列操作时,各个操作并非孤立,而是相关的。 其目的是得出每个操作的平摊代价,平摊代价一般是实际代价的上界。
CLRS上以栈操作、二进制计数器和表拓张三个例子,介绍了三种分析的方法:聚合分析(aggregate analysis),记账法(核算法,accounting method),势能法(potential method)。
其中聚合分析为基础,记账法和势能法是从不同角度出发的聚合分析。
聚合分析
简而言之,就是对数据结构依次进行n个操作 a1,a2,...an ,则在最坏情况下,这n个操作序列是时间复杂度为 T(n) ,那么每个操作的平摊代价 T(n)/n 。因此聚合分析的核心再去求出 T(n) ,然后就可以求出每个操作的平摊代价。
以栈操作为例,n个操作序列中,
T(n)