Lecture14-平摊分析.ppt
《Lecture14-平摊分析.ppt》由会员分享,可在线阅读,更多相关《Lecture14-平摊分析.ppt(18页珍藏版)》请在冰豆网上搜索。
1,平摊分析,高文宇,2,Amortizedanalysis,在平摊分析中,执行一系列数据结构操作所需要的时间是通过对执行的所有操作求平均得出的。
平摊分析保证在最坏情况下,每个操作具有平均性能。
通过平摊分析,可以获得对某种特定数据结构的认识,这种认识有助于优化设计。
(1)聚集分析
(2)记账方法(3)势能方法,3,聚集分析,在聚集分析中,要证明对所有的n,由n个操作所构成的序列的中时间在最坏情况下为T(n)。
因此,在最坏情况下,每个操作的平摊代价为T(n)/n。
4,栈操作,Multipop(S,k):
其作用是弹出栈S中的k个栈顶对象,或者当栈包含少于k个对象时,弹出整个栈的数据对象。
5,Multipop的聚集分析,常规算法分析:
一次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的聚集分析,常规分析:
最坏情况下,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,记账方法,记账方法-accountingmethod:
对不同的操作赋予不同的费用,某些操作的费用比它们的实际代价或多或少。
我们对每一个操作收费的数量称为平摊代价。
但一个操作的平摊代价超过它的实际代价时,两者的差被当作存款(credit),并赋予数据结构中的一些特定对象。
存款可以在以后用于补偿那些平摊代价低于实际代价的操作。
任意操作序列的总的平摊代价必须大于总的实际代价,这样总的平摊代价就是总实际代价的一个上界。
9,记账方法栈操作,对不同的栈操作赋予以下的平摊代价:
PUSH2POP0MULTIPOP0.栈操作的实际代价为:
PUSH1POP1MULTIPOPmin(k,s).对于初始为空的栈,任何的栈操作序列,当一个元素压入栈时,我们需要支付2元,其中一元用于支付该push操作的实际代价,另一元作为“存款”保存在该元素上。
因此在执行pop或multipop操作时,可以用元素上保存的“存款”来支付操作的实际代价。
因此,对任意的包含n次push、pop、multipop操作的序列,总的平摊代价就是其总的实际代价的一个上界。
在此例中,总的平摊代价为O(2n),故总的实际代价为O(n)。
10,记账方法Increment,在Increment中,规定对把某一位设为1的操作收取2元的平摊费用。
当某数位被置为1后,用(2元中)1元来支付置位操作的实际代价,而将另一元存在该位上作为存款,以在后面把该位翻转为0时使用。
因此,在任何时刻,计数器上每个1上都有1元存款。
在while循环中,复位(有1变为0)操作的代价是由有关位上的余款来支付的。
在Increment的第6行至多有1位被设置,所以一次Increment操作的平摊代价至多为2元。
因此对n次Increment操作,总的平摊代价为O(n)。
11,势能方法,Potentialmethod不是将已预付的工作作为存储在数据结构特定对象中的存款来表示,而是表示成一种“势能”,它在需要时可以释放出来,以支付后面的操作。
“势能”是与整个数据结构而非其中的个别对象发生联系的。
12,势能方法工作过程,从一个初始的数据结构D0开始,在其上执行n次操作。
对每一个i=1,2,.,n,我们用ci表示第ith次操作的实际代价,用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)后面部分是一个大于0的数。
13,势能方法工作过程,从直觉上看,若第i个操作的势差(Di)-(Di-1)是正的,则平摊代价Ci尖表示对第i个操作多收了费,同时数据结构的势也增加了。
若势差是负值,则平摊代价表示对第i个操作的不足收费,通过减少势来支付该操作的实际代价。
14,栈操作的“势能”分析,对于栈的三个操作PUSH,POP,andMULTIPOP.定义势能函数为栈中数据对象的个数。
对空栈D0有(D0)=0。
由于栈中对象个数不会为负,因此栈Di具有非负势能,即(Di)0=(D0).因此以表示的n个操作的平摊代价的总和就是实际代价的一个上界。
15,栈的各种操作的平摊代价,PUSH的平摊代价为:
ci+(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操作的平摊代价如下。
设第ith次INCREMENT操作后复位了ti个二进制位。
则实际代价最多为ti+1,(复位数加置位数)。
若bi=0,则第ith次操作复位了lk位。
所以bi-1=ti=k。
若bi0,则bi=bi-1-ti+1。
在则两种情况下都有,bibi-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操作的总平摊代价是总实际代价的一个上界。
因此theworst-casecostofnINCREMENToperationsisO(n).,17,势能方法,Thepotentialmethodgivesusaneasywaytoanalyzethecounterevenwhenitdoesnotstartatzero.Thereareinitiallyb0s,andafternINCREMENToperationstherearebn1s,where0b0,bnk.(Recallthatkisthenumberofbitsinthecounter.)Wecanrewriteequation(17.3)as(17.4)Wehave2forall1in.Since(D0)=b0and(Dn)=bn,thetotalactualcostofnINCREMENToperationsisNoteinparticularthatsinceb0k,aslongask=O(n),thetotalactualcostisO(n).Inotherwords,ifweexecuteatleastn=(k)INCREMENToperations,thetotalactualcostisO(n),nomatterwhatinitialvaluethecountercontains.,18,再见,再见,