算法分析与设计第 3章1【荐】.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文档。上传文档
查看更多
算法分析与设计第 3章1【荐】.ppt

第三章 第三章 算法基本工具和优化技巧 利用算法的基本机制——循环和递归设计算法 利用算法的基本操作提高算法效率的技巧 利用数组提高算法质量 建立高效的数学模型 3.1 循环与递归 3.2 算法优化基本技巧 3.3 算法与数据结构 3.4 优化算法的数学模型 3.1 循环与递归 【例1】求1/1!-1/3!+1/5!-1/7!+…+(-1)n+1/(2n-1)! 分析:此问题中既有累加又有累乘,准确地说累加的对象是累乘的结果。 数学模型1:Sn=Sn-1+(-1)n+1/(2n-1)! 算法设计1:直接利用题目中累加项通式,构造出循环体不变式为: S=S+(-1)n+1/(2n-1)! 需要用二重循环来完成算法,算法1如下: 算法如下: 数学模型2:Sn=Sn-1+(-1)n+1An; An=An-1 *1/((2*n-2)*(2*n-1)) 2.“自顶向下”的设计方法 自顶向下的方法是从全局走向局部、从概略走向详尽的设计方法。自上而下是系统分解和细化的过程。 【例2】 求一个矩阵的鞍点,即在行上最小而在列上最大的点. 算法设计: 1)在第一行找最小值,并记录其列号。 2)然后验证其是否为所在列的最大值,如果是,则找到问题的解;否则,则继续在下一行找最小值 …… 。 buck( ) {int a[10][10]; int i,j,k,minj,t,n=10,kz=0; /*minj代表当前行中最小值的列下标;设置标志量kz*/ readmtr(a,n); prntmtr(a,n); for(i=1;in;i++) {t=a[i][1]; minj=1; for(j=1;jn;j++) if(a[i][j]t) {t=a[i][j];minj=j;} for(k=1;kn;k++) if(a[k][minj]a[i][minj]) break; if(kn) continue; print(“the result is a[“,i ,“][”,minj,“]=”,a[i][minj]); kz=1; break; } if(kz==0) print(“no solution!”); 3.由具体到抽象设计循环结构 3.1.2 递归设计要点 递归的关键在于找出递归方程式和递归终止条件。 两个经典的递归例题: 【例1】汉诺塔问题 【例2】整数的分划问题 【例2】整数的分划问题 模型建立: 算法如下: Divinteger(n, ?m) ? {if ?(n ? ?1 ?or ?m ? ?1) ? Error(“输入参数错误”); else ?if ?(n ?= ?1 ?or ?m ?= ?1) ? ?return(1); else ?if (?n ? m ) return ?Divinteger(n, ?n) ? else ?if ?(n ?= ?m ) return(1 ?+ ?Divinteger(n, ?n-1)) ? else ? ?return(Divinteger(n,m-1) +Divinteger(n-m,m)); } 3.1.3 递归与循环的比较 下面通过几个具体的例子来说明循环和递归的差异和优劣。 【例1】任给十进制的正整数,请从低位到高位逐位输出各位数字。 循环算法设计:从题目中我们并不能获知正整数的位数,再看题目的要求,算法应该从低位到高位逐位求出各位数字并输出。详细设计如下: 1)? 求个位数字的算式为 n mod 10 2)? 为了保证循环体为“不变式”,求十位数字的算式仍旧为n mod 10,这就要通过算式n=n\10,将n的十位数变成个位数。 循环算法如下: f1(n) { while(n=10) { print( n mod 10); n=n\10;} print(n); } 【例3】找出n个自然数(1,2,3,…,n)中r个数的组合。 1)n个数中r的组合,其中每r个数中,数不能相同; 2)任何两组组合的数,所包含的数也不应相同。 例如,5、4、3与3、4、5。为此,约定前一个数应小于后一个数。将上述两条作为约束条件; 3)当r=3时,可用三重循环进行枚举。 分析n=5,r=3时的10组组合数。 1)首先固定第一个数5,其后就是n=4,r=2的组合数,共6个组合。 2)其次固定第一个数4,其后就是

文档评论(0)

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

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

1亿VIP精品文档

相关文档