- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
PAGE7
第17章平摊分析和斐波那契堆
假设对某个数据结构作n个操作。第i个操作实际需要的时间c(i)是:如果i正好是2的整数k次方,即i=2k,那么c(i)=i,否则c(i)=1。请用聚集法分析其平摊时间a(i)。
解: 这n个操作总共需要的时间是:
T(n)=i=1nc(i)=1≤i≤ni≠2k1+1≤i≤ni=
?n+k=1
=n+(2?lgn?+1–2)
?n+2n
?3n。
所以平摊时间是a(i)=T(n)/n?3。
用计账法分析第1题中n次操作的时间复杂度。
解: 第2种操作一次所需要的时间是,当i=2k时,c(i)=i。
我们注意到,在两次第2种操作之间,从i=2k-1到i=2k(k?2)第1种操作做了(2k-2k-1–1)=(2k-1–1)次。所以,如果我们给第1种操作多赋以2个单位时间并用来支付下一次的第2种操作,那么,第2种操作最多只需2个单位时间。很容易看到,这个观察在k=0和k=1时,没有第1种操作帮助,也正确。所以,为计算方便,我们可定义两种操作的平摊时间如下:
第1种操作的平摊时间是3,第2种操作的平摊时间也是3。
那么,第2种操作的总时间?2?第1种操作的次数+2?第2种操作的次数
?2?第1种操作的次数+3?第2种操作的次数
所以,我们有如下分析:
第1题中n次操作的总时间=第1种操作的总时间+第2种操作的总时间
?1?第一种操作的次数+(2?第1种操作的次数+3?第2种操作的次数)
=3?第一种操作的次数+3?第二种操作的次数
=每次操作的平摊时间?(第一种操作的次数+第二种操作的次数)
=3n
=O(n)
重新考虑例17.2中,有k位的二进制计数器的连续增值问题。假设我们除了給二进制计数器增值(即加1)的操作外,还允许在任意次连续增值后清零的操作,也就是把每个比特置为0的操作。另外,如果某次增值后的数字大于计数器能表达的范围,也要清零。请解释如何在二进制计数器(即一个二进制比特的序列)上实现增值(Increment)和清零(Reset)的操作,使得对初值为0的计数器进行n次增值和清零的操作总共需要O(n)时间。请用计账法分析这n个操作的复杂度。(提示:用一个指针指向最高位的1。)
解: 我们用数组A[0..k-1]表示一个有k个比特的计数器。初始时,所有比特为0。另外,我们用一个指针maxA指向值为1的最高比特位。初始时,所有比特为0,置maxA=-1。下面是增值(Increment)和清零(Reset)的操作的伪码。
Increment(A)
i?0
whileikandA[i]=1
A[i]?0
i?i+1
endwhile
ifik
then A[i]?1
ifimaxA //更新最高位的1的位置
thenmaxA?i
endif
else maxA?-1 //数字超出了计数器能表达的范围
endif
End
Reset(A) //清零
fori?0tomaxA
A[i]?0 //重置比特A[i]
maxA?-1 //更新指针maxA
endfor
End
在增值和清零的操作中,计入时间复杂度的基本操作及它们需要的实用时间可假设如下:
把比特0翻转为1需要一个单位时间
把比特1翻转为0需要一个单位时间
重置一个比特需要一个单位时间
更新指针maxA需要一个单位时间。
我们为以上每种基本操作设置平摊时间如下:
把0翻转为1: 平摊时间=3(单位时间)
把1翻转为0: 平摊时间=0
重置一个比特: 平摊时间=0
更新指针maxA: 平摊时间=1。
我们有以下分析:
把0翻转为1的基本操作的总次数:
因为0翻转为1只在增值操作中出现,且每次增值只需翻转一次,所以有:
把0翻转为1的总次数?增值操作的次数?n。
把1翻转为0的基本操作的总次数:
和书中例17.4的分析一样,这个总次数?把0翻转为1的总次数。
重置比特的总次数:
重置比特的操作只出现在清零操作中。在一次清零操作中,重置比特的个数是p=maxA+1。因为指针maxA能到达现在的位置,一定是从上一次清零开始,记数器中数经过了p次进位而得,也就是说,至少经过了p次把比特0翻转为1的操作。所以有:
重置比特的总次数?把0翻转为1的总次数。
更新指针maxA的总次数:
因为每次增值操作或清零操作中,指针maxA最多被更新一
文档评论(0)