1、1,平摊分析,高文宇,2,Amortized analysis,在平摊分析中,执行一系列数据结构操作所需要的时间是通过对执行的所有操作求平均得出的。平摊分析保证在最坏情况下,每个操作具有平均性能。通过平摊分析,可以获得对某种特定数据结构的认识,这种认识有助于优化设计。(1)聚集分析(2)记账方法(3)势能方法,3,聚集分析,在聚集分析中,要证明对所有的n,由n个操作所构成的序列的中时间在最坏情况下为T(n)。因此,在最坏情况下,每个操作的平摊代价为T(n)/n。,4,栈操作,Multipop(S,k):其作用是弹出栈S中的k个栈顶对象,或者当栈包含少于k个对象时,弹出整个栈的数据对象。,5,M
2、ultipop的聚集分析,常规算法分析:一次Multipop的最坏情况代价为O(n),因为栈的大小至多为n。因此若有n个Multipop构成的序列,其复杂度为O(n2)。聚集分析:作用于一个非空栈的一系列Multipop操作最多是把该栈所有数据对象都弹出,因此这个操作序列的总时间为O(n),所以每个Multipop操作的平摊代价为O(n)/n=O(1)。需要强调的是,虽然聚集分析得出一个栈操作的平均代价是O(1),但没有用到概率推理。,6,二进制计数器增1,Increment每次Increment操作的 代价都与被改变值的 位数成线性关系。,上图的总翻转次数可按列累计,7,Increment的
3、聚集分析,常规分析:最坏情况下,Increment每次执行需花费O(k)时间。因此作用于一个初始为零的计数器上的n个Increment操作的时间为O(nk)。聚集分析:每次调用Increment时,A0都要发生翻转,A1则是每两次Increment发生一次翻转,A2则是每四次Increment发生一次翻转,依此类推。因此,作用于初始为零的计数器上的n个Increment操作带来的翻转次数为:n+n/2+n/4+n/8+=2n所以n次Increment操作的总时间为O(n),每次操作的平摊代价为O(1)。,8,记账方法,记账方法-accounting method:对不同的操作赋予不同的费用,某
4、些操作的费用比它们的实际代价或多或少。我们对每一个操作收费的数量称为平摊代价。但一个操作的平摊代价超过它的实际代价时,两者的差被当作存款(credit),并赋予数据结构中的一些特定对象。存款可以在以后用于补偿那些平摊代价低于实际代价的操作。任意操作序列的总的平摊代价必须大于总的实际代价,这样总的平摊代价就是总实际代价的一个上界。,9,记账方法栈操作,对不同的栈操作赋予以下的平摊代价:PUSH 2POP 0MULTIPOP 0.栈操作的实际代价为:PUSH 1POP 1MULTIPOP min(k,s).对于初始为空的栈,任何的栈操作序列,当一个元素压入栈时,我们需要支付2元,其中一元用于支付该
5、push操作的实际代价,另一元作为“存款”保存在该元素上。因此在执行pop或multipop操作时,可以用元素上保存的“存款”来支付操作的实际代价。因此,对任意的包含n次push、pop、multipop操作的序列,总的平摊代价就是其总的实际代价的一个上界。在此例中,总的平摊代价为O(2n),故总的实际代价为O(n)。,10,记账方法Increment,在Increment中,规定对把某一位设为1的操作收取2元的平摊费用。当某数位被置为1后,用(2元中)1元来支付置位操作的实际代价,而将另一元存在该位上作为存款,以在后面把该位翻转为0时使用。因此,在任何时刻,计数器上每个1上都有1元存款。在w
6、hile循环中,复位(有1变为0)操作的代价是由有关位上的余款来支付的。在Increment的第6行至多有1位被设置,所以一次Increment操作的平摊代价至多为2元。因此对n次Increment操作,总的平摊代价为O(n)。,11,势能方法,Potential method不是将已预付的工作作为存储在数据结构特定对象中的存款来表示,而是表示成一种“势能”,它在需要时可以释放出来,以支付后面的操作。“势能”是与整个数据结构而非其中的个别对象发生联系的。,12,势能方法工作过程,从一个初始的数据结构 D0 开始,在其上执行 n 次操作。对每一个 i=1,2,.,n,我们用 ci 表示第 ith
7、 次操作的实际代价,用 Di 表示对数据结构Di-1执行第 ith 操作后的结果。定义势能函数 将数据结构 Di 映射为一个实数(Di),即与数据结构 Di 相关的势能。则第 ith 操作的平摊代价为equation(17.2):每一次操作的平摊代价是其实际代价加上操作带来的“势能”的增加量。根据等式 equation(17.3),有 n 次操作的总平摊代价为:若我们能定义一个势能函数 使得任意情况下满足(Dn)(D0),则n 次操作总的平摊代价是总的实际代价的一个上界。一个方便的做法是定义(D0)=0,然后证明对所有i有(Di)0。这就保证了等式equation(17.3)后面部分是一个大于
8、0的数。,13,势能方法工作过程,从直觉上看,若第i个操作的势差(Di)-(Di-1)是正的,则平摊代价Ci尖表示对第i个操作多收了费,同时数据结构的势也增加了。若势差是负值,则平摊代价表示对第i个操作的不足收费,通过减少势来支付该操作的实际代价。,14,栈操作的“势能”分析,对于栈的三个操作PUSH,POP,and MULTIPOP.定义势能函数为栈中数据对象的个数。对空栈 D0 有(D0)=0。由于栈中对象个数不会为负,因此栈 Di 具有非负势能,即(Di)0=(D0).因此以 表示的n个操作的平摊代价的总和就是实际代价的一个上界。,15,栈的各种操作的平摊代价,PUSH的平摊代价为:ci
9、+(Di)-(Di-1)=1+1=2MULTIPOP(S,k),设 k=min(k,s),所以实际代价为 k“势能”差为(Di)-(Di-1)=-k。因此MULTIPOP(S,k)的平摊代价为:ci+(Di)-(Di-1)=k-k=0。类似地,POP操作的平摊代价也是0。因此,三种操作中的每一种平摊代价都是O(1),因此 n 个操作的序列的总平摊代价为 O(n)。而平摊代价为实际代价的一个上界,因此n 个操作的最坏情况代价为 O(n)。,16,二进制计数器增1,定义第 ith次 INCREMENT 操作后的“势能”为 bi,即第 ith 次操作后计数器中1的个数。计算1次 INCREMENT
10、操作的平摊代价如下。设第 ith 次INCREMENT 操作后复位了 ti 个二进制位。则实际代价最多为 ti+1,(复位数加置位数)。若 bi=0,则第 ith 次操作复位了l k 位。所以 bi-1=ti=k。若 bi 0,则 bi=bi-1-ti+1。在则两种情况下都有,bi bi-1-ti+1,势能差位:(Di)-(Di-1)(bi-1-ti+1)-bi-1=1-ti.因此一次INCREMENT操作的平摊代价为:ci+(Di)-(Di-1)(ti+1)+(1-ti)=2.若计数器从0开始,则有(D0)=0.因为对任意i,有(Di)0。所以 n 次INCREMENT 操作的总平摊代价是总
11、实际代价的一个上界。因此 the worst-case cost of n INCREMENT operations is O(n).,17,势能方法,The potential method gives us an easy way to analyze the counter even when it does not start at zero.There are initially b0 s,and after n INCREMENT operations there are bn 1s,where 0 b0,bn k.(Recall that k is the number of b
12、its in the counter.)We can rewrite equation(17.3)as(17.4)We have 2 for all 1 i n.Since(D0)=b0 and(Dn)=bn,the total actual cost of n INCREMENT operations is Note in particular that since b0 k,as long as k=O(n),the total actual cost is O(n).In other words,if we execute at least n=(k)INCREMENT operations,the total actual cost is O(n),no matter what initial value the counter contains.,18,再见,再见,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1