内容文稿12均摊分析_第1页
内容文稿12均摊分析_第2页
内容文稿12均摊分析_第3页
内容文稿12均摊分析_第4页
内容文稿12均摊分析_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、算法设计与分析第12讲均摊分析信息科学技术学院1主要内容平摊分析的概念平摊分析的三种分析记账法势能法动态表及其上的平摊分析平摊分析在平摊分析中,执行一系列数据结构操作所需要的时间是通过执行的所有操作求平均而得出的。平摊分析可以用来证明在一系列操作中,通过对所有操作求平均之后,即使其中单一的操作具有较大的代价,平均代价还是很小的。平摊分析不牵涉到概率, 平摊分析保证在最坏情况下,每个操作具有的平均性能。平摊分析分析栈S上的三种操作PUSH(S,x):将x压入S 运行时间(1)POP(S):弹出栈顶 运行时间(1)MULTIPOP(S,k):弹出栈顶k个对象MULTIPOP(S, k)1 whil

2、e not STACK-EMPTY(S) and k 023do POP(S)k k - 1 运行时间(min(k,s),s为栈中对象个数n个栈操作的平摊时间设有n个栈操作(PUSH、POP、MULTIPOP ) 的序列,作用于初始为空的栈S。总的运行时间的界是什么?每个操作都可能是MULTIPOP每个MULTIPOP 的运行时间是(min(k, s)=(n)总的运行时间的上界为(n2) 这是一个紧的上界吗?n个栈操作的平摊时间只有PUSH操作增加栈S中的对象个数所有POP和MULTIPOP 弹出的对象数PUSH入栈的对象数 故总的运行时间为(n) 所有PUSH入栈的对象数为(n) 所有POP

3、和MULTIPOP 弹出的对象数也为(n)每个PUSH、 POP和MULTIPOP 操作的平摊时间 (n)/n = (1)法:通过总运行时间求平均得到平摊时间,不需要对操作序列的概率分布做假设。弹出多于二进制计数器计数器A0 k -1 表示为k位二进制位的数组k-1åi x =A i · 2i=0操作INCREMENT实现计数器加一运行时间(k)n个INCREMENT操作序列的运行时间(nk)(紧吗?)INCREMENT(A)1 i 02 while i < lengthA and Ai = 134do Ai 0i i + 15 if i < lengthA6t

4、hen Ai 1INCREMENT操作的平摊时间n个INCREMENT操作序列的运行时间应为 :(n)观察INCREMENT 操作序列每次操作,A0都反转;每两次操作,A1反转; 每2i次操作, Ai反转;于是,总反转次数为$! 1 2in #!( )#log n¥²åå< n= 2n!² 2i #$总时i=间0i=0(n)每个操作平摊时间(n) /n= (1)练习题对某个数据结构执行n个操作的一个序列。如果i为2的整数幂,则第i个操作的代价为i,否则为1。请利用来确定每次操作的平摊代价。分析平摊分析记账法记账法对不同的操作赋予不同的费用

5、,某些操作的费用比它们的实际代价或多或少。我们对一个操作的收费的数量称为平摊代价。当一个操作的平摊代价超过了它的实际代价时,两者的差值就被当作存款,并赋予数据结构中的一些特定对象,可以用来补偿那些平摊代价低于其实际代价的操作。记账法与分析的区别:分析中的所有操作都具有相同的平摊代价。数据结构中的总存款等于总的平摊代价和总的实际代价之差。注意:总存款不能是负的。(?)n个栈操作的平摊时间对PUSH操作多收费,多出来的1元钱放在入栈的对象上,待POP和MULTIPOP把该对象弹出栈时,恰好每个对象上的1元前抵消了操作的实际代价因为栈S中对象数不可能为负,即存款小于0 保证n个操作平摊时间之和是n个

6、操作实际时间的上界操作实际代价平摊代价PUSH12POP10MULTIPOPmin(k,s)0二进制计数器上的记账法分析两个 如何对INCREMENT收费?(平摊代价) 收的费用放在放在哪里?(如何平摊)二进制计数器上的记账法分析注意到,每次INCREMENT只会把一个0反转为1,但可能把多个1反转为0。INCREMENT的实际代价为反转的次数INCREMENT平摊代价为2,用于把0反转为1,并把剩余的1元前存放在反转成1的位上。把1反转成0的实际代价由存放在1上的1元钱支付A1.k-1数组中,1的个数(=存款)不可能为负练习题对某个数据结构执行n个操作的一个序列。如果i为2的整数幂,则第i个

7、操作的代价为i,否则为1。请利用记账来确定每次操作的平摊代价。假设我们希望不仅能使一个计数器增值,也能使之复位至零。请说明如何将计数器实现为一个位数组,使得对一个初始为零的计数器,任一包含n个INCREMENT和RESET操作的序列的时间为O(n)平摊分析势能法势能法(potentialmethod)不是将已预付的费用作为数据结构特定对象中存款来表示,而是表示成一种“势能”或“势”,它在需要时可以操作的额外开销。出来,以支付后面势是与整个数据结构而不是其中的个别对象发生的。(区别于记账法)势函数对一个初始数据结构D0 执行n个操作。对每个i,设ci为每个操作的实际代价, Di 为对数据结构Di

8、-1执行第i个操作的结果。势函数 将每个数据结构Di为一个实数(Di), 即与Di相的势。第i个操作的平摊代价ai根据势函数 定义为aici (Di) (Di-1)即每个操作的平摊代价为其实际代价ci加上由于该操作所增加的势。n个操作的总的平摊代价为ai ci (Dn) (D0)势函数如果势函数使得对所有n,有(Dn) (D0),则总平摊代价ai就是总实际代价ci的一个上界通常为了方便起见会定义(D0) 0(不是必须的)正的势差势 如果第i个操作的势差(Di) - (Di-1)是正的,则平摊代价ai表示对第i个操作多收了费,同时数据结构的势也随之增加了。负的势差不足收费 如果势差是负值,则平摊

9、代价就表示对第i个操作的补足收费, 这是通过减少势来支付该操作的实际代价。平摊代价依赖于所选择的势函数。 不同的势函数可能会产生不同的平摊代价,但它们都是实际代价的上界。最佳势函数的选择取决于所需的时间界。栈操作势能法分析定义势函数为栈中对象的个数开始时要处理是空栈D0,所以(D0)0栈中的对象数始终非负,所以(Di) 0= (D0)以表示的n个操作的平摊代价的总和,那么就是总的实际代价的一个上界对于作用于一个包含s个对象的栈上的第i个操作如果PUSH,则 势差为(Di) (Di-1) = (s+1) s = 1 平摊代价为ai ci (Di) (Di-1) = 1+1=2栈操作势能法分析如果

10、是MULTIPOP(S,k)该操作的实际代价为ci = min(s, k)势差为(Di) (Di-1) = - min(s, k)平摊代价为ai ci (Di) (Di-1) min(s, k) - min(s, k) = 0类似的,如果是POP,平摊代价也为0三种栈操作每种的平摊代价都是O(1), 这样包含n个操作的序列的总平摊代价就是O(n)。已经证明n个操作的平摊代价的总和是总的实际代价的一个上界。所以n个操作的最坏情况代价为O(n)二进制计数器势能法分析计数器A0 k -1 表示为k位二进制位的数组k-åix =Ai ·i=0操作INCREMENT实现计数器加一IN

11、CREMENT(A)1 i 02 while i < lengthA and Ai = 1如何定义势?34do Ai 0i i + 15 if i < lengthA6then Ai 1二进制计数器势能法分析定义势函数为数组A0.k-1中1的个数计算INCREMENT的平摊代价设第i次操作把ti个1反转为0,则实际代价为ti +1设第i次操作后数组中1的个数为bi如果bi = 0,则第i次操作反转了k个1,有bi-1=ti=k;如果bi > 0,则bi两种情形下= bi-1- ti + 1。:bi bi-1- ti + 1势差为 (Di)-(Di-1) (bi-1 - ti

12、+ 1) - bi-1 = 1 - ti平摊开销为 ai = ci +(Di)-(Di-1) (ti+1)+(1-ti) = 2二进制计数器初值非零设计数器中初始有b0个1,n次INCREMENT操作后有bn个1。(0 b0, bn k, k为计数器位数) 对所有的i, ai 2(Dn) = bn , (D0) = b0n次INCREMENT操作总代价ci = ai - (Dn) + (D0) 2 - bn + b0只要k O(n),则总代价就为O(n)= 2n - bn + b0这里并没有要求(Dn) (D0) ,也没有要求(D0) =0练习题对某个数据结构执行n个操作的一个序列。如果i为2

13、的整数幂,则第i个操作的代价为i,否则为1。请利用势能来确定每次操作的平摊代价。考虑普通二叉最小堆上最坏运行时间为O(logn)的操作INSERT和EXTRACT-MIN。请给出势函数,使得INSERT操作的平摊代价为O(logn),EXTRACT-MIN的平摊代价为O(1)。说明如何用两个普通的栈来实现一个队列,使得每个ENQUEUE和DEQUEUE操作的平摊代价都为O(1)。动态表及其上的平摊分析动态表在有些应用中,在开始的时候无法预知在表中要多少个对象。这就希望能根据对象的多少调整所需要的空间(多退少补)表的动态扩张和收缩动态表、删除操作的平摊代价是O(1)用平摊分析证明动态表的具体结构

14、可以是堆、栈、散列表等等假设我们用数组来动态表(不是链表)通过扩张和删除搜索 保证未使用空间总是不多于整个分配空间的一定比例先看只有操作的情形,再拓展也有删除操作算法Insert(T, x)1 if sizeT=023then 给tableT分配一个槽的空间sizeT14 if numT=sizeT56789then 分配一个有2*sizeT个槽的空间的新表将tableT中所有的项tableTtableT指向新表的sizeT2*sizeT到新表中块地址10 将xtableT11 numTnumT+1一次操作的代价操作的代价为O(n)简单分析,一次于是n次操作总代价为O(n2)分析,一次当i-1

15、是2的幂时: 其他时候: ci = 1n操作的代价为ci = i#( )%log n$&总代价ååic£ n +2£ n + 2n = 3nii=0i=0平摊代价为3n/n = 3收费3,其中2元钱分别赋给表中最后记账法,的对象和一个已经没有存款的对象当需要扩张表时,每个对象被一次,恰好用完存款表扩张时操作的平摊代价势函数: (T) = 2numT - sizeT当第i个操作不触扩张,则ai = ci + i- i-1= 1 + (2 · numi- sizei) - (2 · numi-1 - sizei-1)- sizei) - (2(numi - 1) - sizei)= 1 + (2 · numi= 3当第i个操作触扩张,则ai = ci + i- i-1= numi= numi= numi+(2·numi -sizei) - (2 · numi-1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论