摊还分析
聚合分析
n个操作的序列最坏时间复杂度如果是O(n),那么摊还代价就是O(n)/n = O(1)。两个例子:
1.栈操作
pop
push
multipop——pop多个
n个操作指的是连续的n个,所以最坏时间复杂度为O(n).
2.二进制计数器递增
n个递增操作,对每一位的操作数呈等比数列,算出来是O(n)。
核算法
提高某些操作的代价,减少某些操作的代价,使用信用体系。
1.栈操作
push的代价变成2,pop和multipop的代价变为0,这样算出的摊还代价是实际代价的上界,因为信用不为负。
2.二进制计数器递增
对每一位,置位为1的时候,除了1支出,再加上1信用,为了以后复位为0,因为置位不可能连续发生,所以信用也不为负。
势能法
把每一个数据结构映射到一个数,这个数称为势。
定义某一个操作的摊还代价为:
那么n个操作的摊还代价就是:
所以目标就是找到势函数使得:
常常,我们定义初始的势为0,进行操作之后势会增加,也可能减少,但不会小于0。
1.栈操作
定义栈里的元素个数为势函数,算出来结果和核算法的结果一样。
2.二进制计数器递增
定义计数器中1的个数为势函数,算出来也和核算法一样。
摊还代价和后面的Fibonacci堆有关,后面再讲。