- 1、本文档共40页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法的运行时间 = 计算机执行一种简单操作的时间*简单操作的执行次数 (与机器有关,不考虑) 如:t=x; x=y; y=t; 运行时间 = 一条赋值语句的执行时间*3 通常把算法中包含简单操作次数的多少叫做该算法的时间复杂度,用它来衡量一个算法的运行时间性能。 若解决一个问题的规模为n,即表示待处理的数据中包含有n个元素,则算法的时间复杂度通常是n的一个函数,记为f(n)。 例1:分析以下程序的时间复杂度 int Sum(int b[], int n) { int i, s=0; //频度为1 for ( i=0; in; i++ ) //频度为(n+1) s=s+b[i]; //频度为n return s; //频度为1 } (一条语句重复执行的次数称语句的频度) 时间复杂度: f(n) = 2n+3 = O(n) 例2:分析以下程序段的时间复杂度 for ( i=1; i=n; i++) //n+1次 { y++ ; //n次 for ( j=1; j=(2*n); j++ ) //n*(2n+1)次 x++ ; //n*(2n)次 } 时间复杂度: f(n) = (n+1) + n + n*[(2n+1)+(2n)] = 4n2 + 3n +1 = O(n2) 以上时间复杂度的计算相当繁琐,一般算法的时间复杂度采用数量级的形式表示: T(n) = O(f(n)) “O”的形式定义为: 若f(n)是正整数的一个函数,则 T(n)=O(f(n))表示:存在正的常数M和n0, 使得当 n = n0时,∣T(n)︱=M*︱f(n)| 表示随问题规模n的增大,算法执行时间的增长率与函数f(n)的增长率相同。 当 f(n)= c0nm+c1nm-1+…+cm-1n+cm 时, T(n)= O(nm) 采用数量级的形式表示后,时间复杂度不必计算出简单操作的精确次数,只要计算出相应的数量级即可。 例: x =x+1; y =y+1; O(1) for (i=1;i=n;i++) x=x+1 O(n) for (i=1;i=n;i++) for (j=1; j=i-1; j++) x=x+1 O(n2) 算法的时间复杂度是由嵌套最深层语句的频度决定的 算法的时间复杂度通常具有形式: O(1)、 O(log2n) 、 O(n) 、O(n*log2n)、O(n2)、O(n3)、O(2n) 、O(n!) 随着n的增大,各种数量级对应值的增长速度大不相同,对应关系如下: P14 图1.7 O(1) O(log2n) O(n) O(n*log2n) O(n2) O(2n) O(n!) 一个算法的时间复杂度还可以具体分为最好、最差和平均三种情况来讨论 。 例:顺序查找算法 int SequenceSearch(int a[ ], int n, int item) { //若查找成功则返回元素的下标,否则返回-1。 for (int i=0; in; i++) if (a[i]==item) return i; return -1; } 第一个元素a[0]的值就等于item, O(1) 最后一个元素a[n-1]的值等于item,O(n) 每一个元素等于item的概率相同,则查找成功时的平均比较次数 = 1/n*(1+2+…+n) = (n+1)/2, O(n) 比较完所有的n个元素 ,O(n) 。
文档评论(0)