《算法导论》笔记 第17章 17.2 记账方法


【笔记】


记账方法:对不同的操作赋予不同的费用,某些操作的费用比他们的实际代价或多或少。对一个操作的收费的数量称为平摊代价。

当平摊代价超过实际代价时,两者的差值被当做存款,并赋予数据结构中一些特定对象。存款可以在以后用于补偿那些平摊代价低于其实际代价的操作。


总存款等于总的平摊代价和总的实际代价之差,始终是非负的。


【练习】


17.2-1 对一个大小始终不超过k的栈上执行一系列的栈操作。在每个k操作后,复制整个栈的内容以留作备份。证明:在对各种栈操作赋予合适的平摊代价后,n个栈操作的代价为O(n)。

栈操作的平摊代价为2,复制操作代价为0。

则每次栈操作会留下1存款,k次栈操作后存款为k,用来支付复制操作。


17.2-2 利用记账方法的分析重做练习17.1-3。

对每个操作的平摊代价为3。

当i不为2的整数幂时,留下2存款。

当i为2的整数幂时,设i=2^k,令j为上一个2的整数幂,j=2^(k-1),将j到i-1之间的2^(k-1)个数保留的2^k的存款用来支付操作。


17.2-3 假设我们希望不仅能使一个计数器增值,也能使之复位至零。说明如何将一个计数器实现为一个位数组,使得对一个初始为零的计数器,任一个包含n个INCREMENT和RESET操作的序列的时间为O(n)。




你可能感兴趣的:(算法导论)