[理学]算法分析教材习题答案第2章.doc

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

第2章 算法分析题2-2 分析与解答: 算法BinarySearch1与教材中的算法BinarySearch相比,数组段左右游标left和right的调整不正确,导致陷入死循环。 算法BinarySearch2与教材中的算法BinarySearch相比,数组段左右游标left和right的调整不正确,导致x=a[n-1]时返回错误。 算法BinarySearch3与正确算法BinarySearch5相比,数组段左右游标left和right的调整不正确,导致x=a[n-1]时返回错误。 算法BinarySearch4与正确算法BinarySearch5相比,数组段左右游标left和right的调整不正确,导致陷入死循环。 算法BinarySearch5正确,且当数组中有重复元素时,返回满足条件的最右元素。 算法BinarySearch6与正确算法BinarySearch5相比,数组段左右游标left和right的调整不正确,导致x=a[n-1]时返回错误。 算法BinarySearch7与正确算法BinarySearch5相比,数组段左右游标left和right的调整不正确,导致x=a[0]时陷入死循环。 算法分析题2-5 分析与解答: 这个问题有更一般的解。将两个?n位大整数u和v都分割为n/m位的m段,可以用2m-1次n/m位整数的乘法求得uv的值。 事实上,设x=2n/m,可以将u和v及其乘积w=vu表示为: U=u0+u1x+…+um-1xm-1,v=vo+v1x+…+vm-1xm-1 W=uv=w0+w1x+w2x2+...+w2m-2x2m-2 将u,v?和…x2m-1,代入多项式,可得: U(xi)=u0+u1x+…+um-1xm-1,V(xi)=vo+v1x+…+vm-1xm-1 W(xi)=u(xi)v(xi)= w0+w1x+w2x2+...+w2m-2x2m-2 ?用… x12m-2 w0 w(x2) = 1 x2 x22 … x22m-2 w1 . . . . ... . . W(x2m-1) 1 x2m-1 x2m-12 ... x2m-12m-2 w2m-2 设 B= ,则 =B-1 其中,W(xi)=u(xi)v(xi)是两个n/m位数的乘法去处,共有2m-1个乘法,其他均为加减法或数乘运算。 下面用m=3的具体例子来说明。 设x=2n/3,可以将u和v及其乘积w=uv表示为: U= u0+u1x+u2x2 v=vo+v1x+v2x2 w= uv=w0+w1x+w2x2+ w3x3+ w4x4 取5个数 x1,x2,x3,x4,x5为x1=0,x2=-2,x3=2,x4=-1,x5=1。 代入多项式得: a=w(x1)=u0v0 b=w(x2)=(u0-2u1+4u2)(v0-2v1+4v2) c= w(x3)=(u0+2u1+4u2)(v0+2v1+4v2) d= w(x4)=(u0-u1+u2)(v0-v1+v2) e= w(x5)=(u0+u1+u2)(v0+v1+v2) 解得: W0=a W1= W2= W3= W4= X1,x2,x3,x4,x5的不同取法,可以得到不同的分解方法。 按此分解设计的求两个n 位大整数乘积的分治算法需要5次n/3 位整数乘法。分割及合并步所需的加减法和数乘去处的时间为O(n)。设T(n)是算法所需的计算时间,则 T(n)= 由此可得T(n)=O(nlog35)。 一般情况下,将两个n位大整数u和v都分割为长度为n/m的m段,可以用2m-1次n/m位整数的乘法求得uv的值。由此设计出的求两个n位大整数乘积的分治算法需要 2m-1次n/m位整数乘法。分割及合并步所需的加减法和数乘运算的时间为O(n)。因此其计算时间T(n)满足: T(n)= 解此递归式可得:T(n)= O(nlogm(2m-1))。 算法分析题2-13 分析与解答: Void mergesort(int a[],int left, int right) { If(leftright) { Int j=(int )sqrt(right-left+1); If(j1) {for(int i=0;ij;i++) Mergesor

文档评论(0)

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

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

1亿VIP精品文档

相关文档