网站大量收购闲置独家精品文档,联系QQ:2885784924

计算机算法基础 第2版 习题及答案 第17章 .docx

计算机算法基础 第2版 习题及答案 第17章 .docx

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

balala11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档