C程序设计ch10.复杂问题的求解算法.pptxVIP

  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文档。上传文档
查看更多
复杂问题的求解算法;第10章 复杂问题的求解算法;10.1 分治法;分治法的一般算法设计模式 ;例:二分查找法(折半查找法);例:二分查找法(折半查找法);例:在如下升序数组中找15、30、25、32。;请编写一个非递归程序实现折半查找!;int bisearch(int *p, int top, int bott, int key) { int mid; if (topbott) return -1; mid=(top+bott)/2; if (p[mid]==key) return mid; else if (p[mid]key) return bisearch(p, mid+1, bott, key); else return bisearch(p, top, mid-1, key); } int main() { int a[10]={5, 10, 15, 20, 25, 30, 40, 50, 60, 70}, key, pos; scanf(“%d”, key); pos=bisearch(a, 0, 9, key); if (pos==-1) printf(“No find!\n”); else printf(“Position is No. %d\n”, pos+1); return 0; };例:循环赛赛程安排;例:循环赛赛程安排;例:循环赛赛程安排;迭代(非递归)算法如下:;递归算法如下:;递归算法如下:;递归算法如下:;递归算法如下:;10.2 贪心算法;10.2 贪心算法;10.2 贪心算法;10.2 贪心算法;10.2 贪心算法——活动安排问题 ; 活动安排问题贪心策略 先将所有活动按结束时间非递减排列,假设排列结果是: f1=f2=…=f11,如图10.2所示。贪心策略如下: 首先,选择活动1;然后,依次检查活动i是否与当前已选择的活动相容,若相容则将活动i加入到已选择活动的集合中,否则不选择活动i,而继续检查下一活动。;10.2 贪心算法——活动安排问题 ;10.2 贪心算法——活动安排问题 ;10.2 贪心算法——背包问题 ;10.2 贪心算法——背包问题 ;10.2 贪心算法——背包问题 ;10.3 动态规划算法;10.3 动态规划算法;10.3 动态规划算法;10.3 动态规划算法;10.3 动态规划算法;10.3 动态规划算法——最长公共子系列问题; 最长公共子系列(LCS)问题 给定两个序列X=x1, x2, …, xm和Y=y1, y2, …, yn,要求找出X和Y的一个最长公共子序列。 虽然子序列可以是字符系列(即字符串),但最长公共子序列(Longest Common Subsequence, LCS)不同于最长公共子串(Longest Common Substirng),这是因为子串是字符串的一个连续的部分,子序列则是从序列中去掉任意的元素(即不改变序列的顺序)而获得的新序列。 求解最长公共子序列问题时,最容易想到的算???是穷举搜索法, 即对X的每一个子序列,检查它是否也是Y的子序列,从而确定它是否为X和Y的公共子序列,并且选出最长的公共子序列。 序列X的一个子序列相应于下标序列{1, 2, …, m}的一个子序列, 因此,X共有2m个不同子序列,穷举搜索算法的效率太低。 动态规划算法可有效地解此问题。下面我们按照动态规划算法设计的各个步骤来设计一个解此问题的有效算法。 ; 最长公共子系列(LCS)的结构 定理 LCS具有最优子结构性质。 设序列Xm=x1, x2, …, xm和Yn=y1, y2, …, yn的一个最长公共子序列Zk=z1, z2, …, zk,则: 若xm=yn,则zk=xm=yn, 且Zk-1是Xm-1和Yn-1的最长公共子序列, 即:在Xm-1和Yn-1的最长公共子序列Zk-1的基础上,再加上xm(=yn),则可以构造得到Xm和Yn的最长公共子序列Zk; 若xm≠yn且zk≠xm,则 Zk也是Xm-1和Yn的最长公共子序列; 若xm≠yn且zk≠yn,则 Zk也是Xm和Yn-1的最长公共子序列。 其中,Xm-1=x1, x2, …, xm-1,Yn-1和Zk-1类似。; 子问题递归结构 由最长公共子序列问题的最优子结构性质可知,要找出序列Xm和Yn的最长公共子序列,可按以下方式递归地进行: 当xm=yn时,首先找出Xm-1和Yn-1的最长公共子序列;然后在其尾部加上xm(=yn)即可得Xm和Yn的一个最长公共子序列。 当xm≠yn时,必须解两个子问题,即分别找出Xm-1和Yn 的最长公共子序列、Xm 和Yn-1的最

文档评论(0)

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

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

1亿VIP精品文档

相关文档