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

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

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

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

PAGE41

第7章 贪心算法

假设数组A[1..n]和B[1..m]已经排好序,A[1]£A[2]£…£A[n],和B[1]£B[2]£…£B[m]。请设计一个复杂度为O(n+m)的贪心算法在数组A[1..n]和B[1..m]中各找一个数A[u]和B[v]使得它们的差别|A[u]-B[v]|最小。

解:我们先考虑A[1]和B[1],记下他们的差|A[1]-B[1]|。当然这个差很可能不是最小的。我们要继续找更好的解。下一步该如何做呢?我们观察到,如果A[1]?B[1],那么A[1]不可能在更好的解中,这是因为对任何B[v],v1,都有|A[1]-B[v]|?|A[1]-B[1]|。类似地,如果A[1]B[1],那么B[1]不可能在更好的解中。这个过程很象合并二个序列,每次取两序列的首项做比较,用它们的差来更新目前最佳解,然后,刪去较小的首项。根据这个观察,我们有以下算法。

Minimum-difference(A[1..n],B[1..m],u,v,d) //d=|A[u]-B[v]|是最小差值

d?¥ //初始化

i?1

j?1

whilei£nandj£m

if|A[i]-B[j]|d

then u?i

v?j

d?|A[i]-B[j]|

endif

ifA[i]£B[j]

then i?i+1

else j?j+1

endif

endwhile

return(u,v,d)

End

因为在第4行到第14行的循环中,每检查一对数字,A[i]和B[j],我们就从两序列中刪去一个数,所以,与合并算法类似,上述算法的复杂度为O(m+n)。

请设计一个复杂度为?(nlgn)的算法来确定有n个数的集合A[1..n]中是否有两个数字之和正好等于一个给定的数x。

解:第一步,我们先将A[1..n]排序,使得A[1]≤A[2]≤A[3]≤…≤A[n]。

第二步,检查A[1]+A[n]。如果A[1]+A[n]=x,则任务完成。否则,如果A[1]+A[n]x,则A[1]不会在解中,下面的检查可不考虑A[1];如果A[1]+A[n]x,则A[n]不会在解中,下面的检查可不考虑A[n]。

第三步,重复第二步的做法,在剩下的要检查的序列中把首尾两项相加。如果和为x则搜索成功,否则,在丢弃一个数字后的序列中继续用这个办法搜索直到找到答案。算法的伪码如下。

Search-SUM(A[1..n],x)

SortA[1..n]suchthatA[1]≤A[2]≤A[3]≤…≤A[n]

i?1

j?n

whileij

ifA[i]+A[j]=x

thenreturn(true,i,j)

else ifA[i]+A[j]x

theni?i+1

elsej?j-1

endif

endif

endwhile

return(false)

End

因为排序需要?(nlgn)时间,第4行到第12行的while循环需要O(n)时间,所以上面算法的复杂度为?(nlgn)。

给定一数组A[1..n],请设计一个O(nlgn)的算法来确定数组A中是否有两个数A[i]和A[j](1?i,j?n),使得A[i]=A[j]+1。如果有,则报告(i,j),否则报告(0,0)。注意,数组A中的数可以是实数,不一定是整数。另外,ij或ij都可以。

解:显然,如果我们检查所有可能的两个数的话,我们就需要?(n2)次运算。我们的做法是,先把数组A[1..n]排序后放入另一数组B,使得B[1]≤B[2]≤B[3]≤…≤B[n]。我们把排序后的A[1..n]放入另一数组B,而不是数组A本身,是为了方便报告数字在原始序列中的序号。然后,用贪心法搜索是否有u和v使得B[u]=B[v]+1。如果有,找出它们在序列A中序号。设B[u]=A[i],B[v]=A[j],那么我们有A[i]=A[j]+1。

在搜索u和v时,初始化指针v=1,u=2。如果B[u]=B[v]+1,则找到答案,输出结果。否则,如果B[u]B[v]+1,那么B[v]不可能在解中,故在下面搜索中可刪去,我们把指针v加1。如果B[u]B[v]+

文档评论(0)

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

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

1亿VIP精品文档

相关文档