第九章算法分析与设计.pptVIP

  1. 1、本文档共30页,可阅读全部内容。
  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文档。上传文档
查看更多
第九章 算法分析与设计* 算法与数据结构的关系 不了解施加于数据上的算法就无法决定如何构造数据; 反之算法的结构和选择又常常在很大程度上依赖于作为基础的数据结构。 算法+数据结构=程序 9.1算法分析技术 9.1.1空间代价分析 静态分析 动态分析 9.1.2时间代价分析 循环 递归 9.1.1空间代价分析 1。静态分析 求出算法中使用的所有变量的存储空间,再折合成多少空间单位即可。 void insertSort(SortObject * pvector) { int i, j; RecordNode temp; for( i = 1; i pvector-n; i++ ) { temp = pvector-record[i]; j = i-1; while((temp.keypvector-record[j].key)(j=0)) { pvector-record[j+1] = pvector-record[j]; j--; } if(j!=(i-1)) pvector-record[j+1] = temp; } } 9.1.1空间代价分析 2。动态分析 动态空间的确定主要由两种情况构成: (1)函数的递归; (2)调用动态分配(malloc)和回收(free)函数 (1)函数的递归; 递归深度为h,动态空间代价为C*h (2)调用动态分配(malloc)和回收(free)函数 主要考虑分配内存大小与规模无关的情况。这时空间代价由分配和回收的次数决定。 9.1.2时间代价分析 算法的执行时间绝大部分花在循环和递归上。 1。循环 循环语句的时间代价一般用以下三条原则分析: 对于一个循环,循环次数乘以每次执行简单语句的数目即为其时间代价。 对于多个并列循环,可先计算每个循环的时间代价,然后按大O表示法的加法规则计算总代价。 对于多层嵌套循环,一般可按大O表示法的乘法规则计算。但如果嵌套是有条件的,为精确计算其时间代价,要仔细累加循环中简单语句的实际执行数目,以确定其时间代价。 9.1.2时间代价分析 循环分析示例1: int Index_KMP(SeqString t, SeqString p, int pos) { int i, j, *next; next = (int *)malloc(sizeof(int)*(p.n+1)); GetNext(p, next); j = pos; i = 0; while(i p.n j t.n) { if(i == -1 || p.c[i] == t.c[j]) { ++i; ++j; } else i = next[i]; } free(next); if(i = p.n) return (j – p.n+1); /* Found */ else return -1; } /* end of Index_KMP() */ 2。递归 对于递归算法,一般可把时间代价表示为一个递归方程。 9.2算法设计技术 最基本的算法设计技术: 分治法 贪心法 动态规划法 回溯法 9.2.1分治法 分治策略是把一个规模为n的问题分成两个或多个较小的与原问题类型相同的子问题,通过对子问题的求解,并把子问题的解合并起来从而构造出整个问题的解,即对问题分而治之。如果子问题的规模仍然相当大,仍不足以很容易地求得它的解,这时可以对此子问题重复地应用分治策略。 9.2.2贪心法 贪心法把构造可行解的工作分阶段来完成。在各个阶段,选择那些在某些意义下是局部最优的方案,期望各阶段的局部最优的选择带来整体最优。 戴克斯特拉的最短路径算法 Kruskal的求最小生成树算法 背包问题 9.2.3动态规划法 在求解某些问题的时候,可以试着把问题分成必要多的子问题,每个子问题又可以分成数目不确定的必要多的子子问题,这样就会产生大量的子问题。如果分得的子问题界限不清,互相交叉,则在大量的子问题中会存在一些完全相同的子问题,为了避免界重复解这些相同的子问题,可以在解决一个子问题后把它的解保留下来,若遇到求解与之相同的子问题的时候,就可以把它找出来直接使用。为解问题而将它的子问题的解填入表中以待需要时查表,这样的方法就是动态规划法。 9.2.4回溯算法 有一些问题,要求找到一组解,或要求找到一个满足某些条件的最优解。对于解决这样的问题,可以通过使用彻底的搜索方法来解决。然而,彻底的搜索,要进行大量的比较,大量的舍弃,要以大量的运算时间为代价,对于这种情况使用回溯算法可以大大减少搜索的次数, 小 结 分治法通过把问题化为较小的问题来解决原问题,简化或减少了对题目的运算; 贪心法

文档评论(0)

天马行空 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档