《算法设计及分析》-第二章 递归及分治.pptVIP

《算法设计及分析》-第二章 递归及分治.ppt

  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文档。上传文档
查看更多
第二章 递归与分治策略 第二章 递归与分治 2.1 分治法的基本思想 2.2 分治法的适用条件 2.3 分治法的基本步骤 2.4 分治法的应用 2.1 分治法(divide-and-conquer)的基本思想 为求解大问题,可以: 分割成k个更小规模的子问题。 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。 将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。 2.1 分治法的基本思想 将要求解的较大规模的问题分割成k个更小规模的子问题。 2.2 分治法的适用条件 分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 2.3 分治法的基本步骤 divide-and-conquer(P) { if ( | P | = n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 } 2.3 分治法的基本步骤 2.4 分治法的应用 分治算法通常采用递归操作实现。但并非所有的递归函数都是分治算法。 2.4 分治法的应用 例1 阶乘函数 阶乘函数可递归地定义为: 2.4 分治法的应用 例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为: 2.4 分治法的应用 例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为: 2.4 分治法的应用 例3 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 全排列算法 void perm(int list[], int k, int m) { //产生list[k..m]的所有排列 //其中list[0..k-1]是前缀,后缀是list[k..m] //调用perm(list,0,n-1)则产生list[0..n-1]的全排列 if (k==m){ For (i=0;i=m;i++) Printf(“%d ”,list[i]); Printf(“\n”); } else For(i=k;i=m;i++){ Swap(list[k],list[i]); Perm(list,k+1,m); Swap(list[k],list[i]); } } 2.4 分治法的应用 2.4 分治法的应用 例5 棋盘覆盖 2.4 分治法的应用 例6 合并排序 非递归的归并排序算法 void MergeSort(int a[], int n){ s=1; while(sn){ MergePass(a,b,s,n); s+=s; MergePass(b,a,s,n); s+=s; } } 非递归的归并排序算法(续) void Merge (int c[],int d[],int l,int m,int r){ i=l;j=m+1;k=l; while(i=mj=r){ if(c[i]=c[j]) d[k++]=c[i++]; else d[k++]=c[j++]; } if(im) for(q=j;q=r;q++) d[k++]=c[q]; else for(q=i;q=m;q++) d[k++]=c[q]; } 2.4 分治

文档评论(0)

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

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

1亿VIP精品文档

相关文档