第2章 递归与分治_作业答案.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
课后练习 练习1:给定数组a[0:n-1], 试设计一个分治法算法,找出a[0:n-1]中元素最大值和最小值; 写出该算法时间函数T(n)的递推关系式; 分析该算法的时间复杂度和空间复杂度。 算法的基本思想:如果数组中只有一个元素,则该元素即是数组中最大的元素,否则将数组对分为前半部分和后半部分。 ⑴用同样的方法求数组前半部分的最大值max1。 ⑵用同样的方法求数组后半部分的最大值max2。 ⑶若max1max2,则max1为数组中的最大值;否则max2为数组中的最大值。 具体执行过程:求最大值 int MAXA( A, i, j) { int i, j, max=0, max1=0, max2=0; int A[]; if( i==j ) max=A[i]; else //求数组前半部分的最大值max1 { max1 = MAXA( A, i, (i+j)/2 ); //求数组后半部分的最大值max2 max2 = MAXA( A, (i+j)/2+1, j ); if( max1 max2 ) max = max1; else max = max2; } return max; } 课后练习 练习2:分析如下时间函数的复杂度,并说明原因。 1. 利用递归树说明以下时间函数的复杂度: 练习2:分析如下时间函数的复杂度,并说明原因。 1. 利用递归树说明以下时间函数的复杂度: 2. 利用主定理说明以下时间函数的复杂度: 练习3:分析Strassen矩阵乘法在时间效率上有何改进,为什么? 课后练习 练习4:划出下列序列在快速排序过程中一次划分的具体步骤。 21 25 49 25* 16 08 一次划分的过程 课后练习 练习5:算法实现题2-8(教材第42页)集合划分问题。 要求: 设计算法; 写出该算法时间函数T(n)的递推关系式; 分析其时间复杂度和空间复杂度。 关于集合划分问题的分析 例如:集合 { 1, 2, 3 } 有五个划分 { {1}, {2}, {3} }, { {1, 2}, {3} },{ {1, 3}, {2} },{ {1}, {2, 3} }, { {1, 2, 3} }。 算法设计要求:给定正整数n 和m,计算出n 个元素的集合{1,2,., n }可以划分为多少个不同的由m 个非空子集组成的集合。 数据输入:由文件input.txt 提供输入数据。文件的第1 行是元素个数n 和非空子集数m。 结果输出:程序运行结束时,将计算出的不同的由m个非空子集组成的集合数输出到文件output.txt 中。 递归公式: 设n个元素的集合可以划分为F(n,m)个不同的由m个非空子集组成的集合。 考虑3个元素的集合,可划分为 ① 1个子集的集合:{{1,2,3}} ② 2个子集的集合:{{1,2},{3}},{{1,3},{2}},{{2,3},{1}} ③ 3个子集的集合:{{1},{2},{3}} ∴F(3,1)=1;F(3,2)=3;F(3,3)=1; 课后练习(选做) 练习6:假设有n个项的数组A,每个项具有一个不同的数。告诉你值A[1],A[2],…,A[n]的序列是单峰的:对于某个在1与n之间的下标p,数组项的值增加到A中的位置p,然后剩下的过程减少直到位置n。 要求: 利用分治策略设计一个算法,读尽可能少的元素,找到这个“顶峰”元素p。 分析该算法的时间复杂性。 问题分析 何为“单峰”? 对于某个在1与n之间的下标p,数组项的值增加到A中的位置p,然后剩下的过程减少直到位置n; 即在A[1]到A[n]的n个数中,只有一个极大值A[p]; A[p]前的元素均小于A[p],并按升序排列; A[p]后的元素均小于A[p],并按降序排列。 分治法思想 查看A[n/2]值,分析其是出现在上坡上( A[n/2]在A[p]之前)还是下坡上(A[n/2]在A[p]之后)。 如果A[n/2-1]<A[n/2]<A[n/2+1],那么n/2项一定严格位于p的前面,因此可以在n/2+1项到n项之间递归地继续下去。 如果A[n/2-1]>A[n/2]>A[n/2+1],那么n/2项一定严格位于p的后面,因此可以在1项到n/2-1项之间递归地继续下去。 如果A[n/2]比A[n/2-1]和A[n/2+1]都大,顶峰项实际上就等于A[n/2]。 具体算法:伪代码 int Danfeng(int A[], int m, int n) { //求单峰数组中的顶峰值 int k=(m+n)/2; if(k==mk==n) return A[k]; if(A[k-1]A

文档评论(0)

糖糖 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档