0第十章++算法分析与设计.pptVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
讨论 分治策略把问题分成若干个子问题,分成的子问题的数目一般不大。 如果每次分成的各子问题的规模相等或近乎相等的话,则分治策略的效率较高,否则效率就比较低。 例如:直接插入排序(算法8.1)可以看作是把原问题分解成两个子问题,一个是规模为1的问题,另一个是规模为n-1的问题,算法的时间代价是O(n2)级的。 而归并排序把原问题分成了两个大小为n/2的问题,算法的时间代价是O(nlog2n)级的。 10.2.2贪心法 求着色问题近似解的贪心法(greedy) 其基本思想为:先用一种颜色给尽可能多的结点上色,然后再用另一种颜色在未着色的结点中给尽可能多的结点上色,如此反复直到所有结点都被着色为止。 Dijkstra的最短路径算法 求从源点到其它各结点的最短路径 它总是从那些最短路径还不知道的结点中挑选一个到源点最近的结点。 另一采用贪心策略的算法是Kruskal的求最小生成树算法 背包问题:给定n个物体和一个背包,已知物体i的重量为wi>0,价值为pi,背包能容纳物体的重量为M。要求确定一组分数xi(0≤xi≤1),能够把物体i的xi部分放入背包,使得 最大(即将尽量多的价值装入背包)。 因为: p1/w1=25/18=1.38, p2/w2=24/15=1.6, p3/w3=15/10=1.5, p2/w2>p3/w3>p1/w1。 所以首先把物品2全部放入背包,然后考虑物品3,最后如果还有余地考虑物品1。这样得到的结果为(x1,x2,x3)=(0,1,1/2), 例如:n=3,M=20, (p1,p2,p3)=(25,24,15), (w1,w2,w3)=(18,15,10) 解背包问题的贪心算法的实现: 其中参数数组p和w中,按p[i]/w[i]的降序分别存放物体的价格和重量;m是背包能放的物体总重量,n是物体件数。x存放解向量。 float knapSack(float* p, float* w, float * x ,float m, int n) { int i=0; float s=0; while(in p[i]m) { m -= w[i]; s += p[i]; x[i] = 1; i++; } if ( in m0 ) { s += p[i]*m/w[i]; x[i] = m/w[i]; i++; } for ( ; in ; i++ ) x[i]=0; return (s); } ? 讨论 贪心法在各个阶段,选择那些在某些意义下是局部最优的方案,但不是每次都能成功地产生出一个整体最优解。 仍然以着色问题为例,如果要着色的图如图10.1所示,采用贪心法,并且按a、b、c、d、e的顺序处理,得到的结果则需要三种不同的颜色:第一种颜色着a和b,第二种颜色着c和d,剩下的e还需要一种颜色才行。 对某些问题,如果只要求得一个与最优解相差不多的次优解就满足要求时,选用贪心法可以帮助我们很快地得到这样的解。 10.2.3 动态规划法 有些问题常常在分解时会产生大量的子问题,同时子问题界限不清,互相交叉,因而可能重复多次解同一个子问题。 解决这种重复的方法:可以在得到每个子问题的解(包括其子子问题的解)时,把解保留在一个表格中,遇到相同的子问题时,就从表中找出来直接使用。这种方法就是动态规划法(Dynamic Programming)。 例10.10 求组合数。 我们知道组合数有这样的一个递推式: 每次求解可将其分为两个子问题和。把 按递推式分解得到图10.2的二叉树结构。 例子 本书所见过的运用动态规划法的算法有: 所有结点间的最短路径算法 最佳二叉排序树的构造算法。 例10.10[求组合数]组合数有下面的递推式: 把 按递推式分解 得到的二叉树结构。 首先,将m=n的位置上以及n=0的位置上元素皆填为1。填某一中间表目时,只要把它右边表目的元素与右下方表目的元素之和填入即可。这样,很快就能求出 =10。 计算组合数的动态规划算法: int combinat(int m,int n){ int i,j; int mat[1000][1000]; if(n==0||m==n)return 1; for(j=0;jn;j++){ mat[0][j]=1; for(i=1;i=m-n;i++) if (j==0) mat[i][j]=i+1; else mat[i][j]=mat[i-1][j]+mat[i][j-1]; } /* 计算Cmn

文档评论(0)

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

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

1亿VIP精品文档

相关文档