网站大量收购独家精品文档,联系QQ:2885784924

(算法分析的设计)第一章:算法概述.ppt

  1. 1、本文档共74页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(算法分析的设计)第一章:算法概述.ppt

三种时间复杂性——最坏情况 最坏情况 I*是DN中使T(N,I*)达到Tmax(N)的合法输入 以上三种情况的复杂性从不同角度来反映算法的效率,各有其局限性和用处,但操作性最好且最具有实用价值的是最坏情况下的时间复杂性。 如果无特别说明,T(N)=Tmax(N) 算法的效率分析:实例1 问题:已知不重复且已经按从小到大排好的m个整数的数组A[m],对于给定的整数c,要求寻找一个下标i,使得A[i]=c,若找不到,则返回一个0。 算法1:从头到尾扫描数组A。 procedure search( c) /*c是整型数 */ { i←0; j←0; while jm do { if A[j]=c then i ← j; j←j+1; } return i; } 在最坏的情况下,这个算法要检测A的所有m个分量才能判断在A中找不到等于c的分量. 是否有改进的方法? 用冒泡排序算法按从大到小顺序排列数组的基本运算如下: for i ←1 to n-1 do for j ←1 to n-i do if a[j]a[j+1] then 交换a[j]、a[j+1]; 该算法的运算时间可以用比较次数n(n-1)/2表示,它是问题的输入规模n的函数。 T(n)= n(n-1)/2 n在不同的问题中有不同的表现形式。例如:在数组中找值 为c的分量,问题的规模是数组中分量的个数。遍历一棵二叉树 ,问题的规模是树中的结点数。 算法的效率分析:实例2 冒泡排序算法的改进算法如下: for i ←1 to n-1 do { flag=1; for j ←1 to n-i do if a[j]a[j+1] then {交换a[j]、a[j+1];flag=0;} if flag=1 then break; } 该算法当输入程序已经排好序,运算时间为(n-1)次,最好、平均情况下的时间得到改进,但最坏情况情况下所需时间不变。 使用程序步分析算法 一个程序步(program step)是指在语法上或语义上有意义的程序段,该程序段的执行时间必须与问题实例的规模无关。 templateclass Type void insertion_sort(Type *a, int n) { Type key; // cost times for (int i = 1; i n; i++){ // c1 n key=a[i]; // c2 n-1 int j=i-1; // c3 n-1 while( j=0 a[j]key ){ // c4 sum of ti a[j+1]=a[j]; // c5 sum of (ti-1) j--; // c6 sum of (ti-1) } a[j+1]=key; // c7 n-1 } } 在最好情况下,ti=1, for 1 ? i n; 在最坏情况下,ti =i+1, for 1 ? i n; 分析的简化 由于ci的引入,分析很复杂,由此只考虑语句的执行次数(执行频率),算法的时间复杂度就是各语句执行频率总数 : 复杂性渐近性态 要求用计算机解决的问题越来越复杂,规模越来越大,对这类问题的求解算法作复杂性分析具有特别重要的意义。 分析算法的时间复杂性的目的是为了比较完成同一功能的程序的算法之间的最主要的差别。 两个算法执行步数分别是3n+2和3n+20,则两个算法的时间复杂性不会有太大的差别,这两个程序的时间复杂性至多相差一个常数倍。 对于两个具有时间复杂性2n和cn的两个算法,对于充分大的n,两者的复杂性差别是很大的。 要引进渐进符号(asympto

文档评论(0)

youngyu0329 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档