欢迎来到天天文库
浏览记录
ID:39283087
大小:65.51 KB
页数:5页
时间:2019-06-29
《算法时间复杂度计算示例》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、基本计算步骤 示例一: (1)intnum1,num2;(2)for(inti=0;i2、忽略掉T(n)中的常量、低次幂和最高次幂的系数,得到f(n)=n*log2n{可省略:lim(T(n)/f(n))=(2+4n+3n*log2n)/(n*log2n) =2*(1/n)*(1/log2n)+4*(1/log2n)+3当n趋向于无穷大,1/n趋向于0,1/log2n趋向于0,极限等于3。}T(n)=O(n*log2n)简化的计算步骤 再来分析一下,可以看出,决定算法复杂度的是执行次数最多的语句,这里是num2+=num1,一般也是最内循环的语句。并且,通常将求解极限是否为常量也省略掉?于是,以上步骤可以简化为: 1.找到执行次数最多的语句 2.3、计算语句执行次数的数量级3.用大O来表示结果 继续以上述算法为例,进行分析:1.执行次数最多的语句为num2+=num12.T(n)=n*log2nf(n)=n*log2n3.//lim(T(n)/f(n))=1T(n)=O(n*log2n) --------------------------------------------------------------------------------一些补充说明 最坏时间复杂度 算法的时间复杂度不仅与语句频度有关,还与问题规模及输入实例中各元素的取值有关。一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。这就保4、证了算法的运行时间不会比任何更长。求数量级 即求对数值(log),默认底数为10,简单来说就是“一个数用标准科学计数法表示后,10的指数”。例如,5000=5x103(log5000=3),数量级为3。另外,一个未知数的数量级为其最接近的数量级,即最大可能的数量级。复杂度与时间效率的关系:c5、--------------------------6、--------------------------7、-------------8、 较好 一般 较差---------9、-----------------------------------------------------------------------------------------复杂情况的分析 以上都是对于单个嵌套循环的情况进行分析,但实际上还可能有其他的情况,下面将例举说明。1.并列循环的复杂度分析 将各个嵌套循环的时间复杂度相加。例如: for(i=1;i<=n;i++) x++; for(i=1;i<=n;i++) for(j=1;j<=n;j++) x++;解:第一个for循环T(n)=nf(n)=n时间复杂度为Ο(n)第二个for循环T(n10、)=n2f(n)=n2时间复杂度为Ο(n2)整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。2.函数调用的复杂度分析 例如:publicvoidprintsum(intcount){ intsum=1; for(inti=0;i11、算法进行优化,改为:publicvoidprintsum(intcount){ intsum=1; sum=count*(count+1)/2; System.out.print(sum);}这样算法的时间复杂度将由原来的O(n)降为O(1),大大地提高了算法的性能。 3.混合情况(多个方法调用与循环)的复杂度分析 例如:publicvoidsuixiangMethod(intn){ printsum(n);//1.1 for(inti=0;i
2、忽略掉T(n)中的常量、低次幂和最高次幂的系数,得到f(n)=n*log2n{可省略:lim(T(n)/f(n))=(2+4n+3n*log2n)/(n*log2n) =2*(1/n)*(1/log2n)+4*(1/log2n)+3当n趋向于无穷大,1/n趋向于0,1/log2n趋向于0,极限等于3。}T(n)=O(n*log2n)简化的计算步骤 再来分析一下,可以看出,决定算法复杂度的是执行次数最多的语句,这里是num2+=num1,一般也是最内循环的语句。并且,通常将求解极限是否为常量也省略掉?于是,以上步骤可以简化为: 1.找到执行次数最多的语句 2.
3、计算语句执行次数的数量级3.用大O来表示结果 继续以上述算法为例,进行分析:1.执行次数最多的语句为num2+=num12.T(n)=n*log2nf(n)=n*log2n3.//lim(T(n)/f(n))=1T(n)=O(n*log2n) --------------------------------------------------------------------------------一些补充说明 最坏时间复杂度 算法的时间复杂度不仅与语句频度有关,还与问题规模及输入实例中各元素的取值有关。一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。这就保
4、证了算法的运行时间不会比任何更长。求数量级 即求对数值(log),默认底数为10,简单来说就是“一个数用标准科学计数法表示后,10的指数”。例如,5000=5x103(log5000=3),数量级为3。另外,一个未知数的数量级为其最接近的数量级,即最大可能的数量级。复杂度与时间效率的关系:c5、--------------------------6、--------------------------7、-------------8、 较好 一般 较差---------9、-----------------------------------------------------------------------------------------复杂情况的分析 以上都是对于单个嵌套循环的情况进行分析,但实际上还可能有其他的情况,下面将例举说明。1.并列循环的复杂度分析 将各个嵌套循环的时间复杂度相加。例如: for(i=1;i<=n;i++) x++; for(i=1;i<=n;i++) for(j=1;j<=n;j++) x++;解:第一个for循环T(n)=nf(n)=n时间复杂度为Ο(n)第二个for循环T(n10、)=n2f(n)=n2时间复杂度为Ο(n2)整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。2.函数调用的复杂度分析 例如:publicvoidprintsum(intcount){ intsum=1; for(inti=0;i11、算法进行优化,改为:publicvoidprintsum(intcount){ intsum=1; sum=count*(count+1)/2; System.out.print(sum);}这样算法的时间复杂度将由原来的O(n)降为O(1),大大地提高了算法的性能。 3.混合情况(多个方法调用与循环)的复杂度分析 例如:publicvoidsuixiangMethod(intn){ printsum(n);//1.1 for(inti=0;i
5、--------------------------
6、--------------------------
7、-------------
8、 较好 一般 较差---------
9、-----------------------------------------------------------------------------------------复杂情况的分析 以上都是对于单个嵌套循环的情况进行分析,但实际上还可能有其他的情况,下面将例举说明。1.并列循环的复杂度分析 将各个嵌套循环的时间复杂度相加。例如: for(i=1;i<=n;i++) x++; for(i=1;i<=n;i++) for(j=1;j<=n;j++) x++;解:第一个for循环T(n)=nf(n)=n时间复杂度为Ο(n)第二个for循环T(n
10、)=n2f(n)=n2时间复杂度为Ο(n2)整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。2.函数调用的复杂度分析 例如:publicvoidprintsum(intcount){ intsum=1; for(inti=0;i11、算法进行优化,改为:publicvoidprintsum(intcount){ intsum=1; sum=count*(count+1)/2; System.out.print(sum);}这样算法的时间复杂度将由原来的O(n)降为O(1),大大地提高了算法的性能。 3.混合情况(多个方法调用与循环)的复杂度分析 例如:publicvoidsuixiangMethod(intn){ printsum(n);//1.1 for(inti=0;i
11、算法进行优化,改为:publicvoidprintsum(intcount){ intsum=1; sum=count*(count+1)/2; System.out.print(sum);}这样算法的时间复杂度将由原来的O(n)降为O(1),大大地提高了算法的性能。 3.混合情况(多个方法调用与循环)的复杂度分析 例如:publicvoidsuixiangMethod(intn){ printsum(n);//1.1 for(inti=0;i
此文档下载收益归作者所有