如何计算程序时间复杂度(实战篇)
来源:互联网 发布:通信网络设计师是什么 编辑:程序博客网 时间:2024/06/16 13:03
概念:
1.一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。
一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
2.一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n))。随着模块n的增大,算法执行的时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高。
计算步骤:
⑴ 找出算法中的基本语句;
算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。
⑵ 计算基本语句的执行次数的数量级;
只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。
⑶ 用大Ο记号表示算法的时间性能。
将基本语句执行次数的数量级放入大Ο记号中。
再找出T(n)的同数量级(它的同数量级有以下:1,Log2n ,n ,
nLog2n ,n的平方,n的三次方,2的n次方,n!),找出后
f(n)=该数量级,若T(n)/f(n)求极限可得到一常数c,则时间复
杂度T(n)=O(f(n))。
时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)
比如:一般总运算次数表达式类似于这样:
a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+f
a ! =0时,时间复杂度就是O(2^n);
a=0,b<>0 =>O(n^3);
a,b=0,c<>0 =>O(n^2)依此类推
eg:
(1) for(i=1;i<=n;i++) //循环了n*n次,当然是O(n^2)
for(j=1;j<=n;j++)
s++;
(2) for(i=1;i<=n;i++)//循环了(n+n-1+n-2+…+1)≈(n^2)/2,因为时间复杂度是不考虑系数的,所以也是O(n^2)
for(j=i;j<=n;j++)
s++;
(3) for(i=1;i<=n;i++)//循环了(1+2+3+…+n)≈(n^2)/2,当然也是O(n^2)
for(j=1;j<=i;j++)
s++;
(4) i=1;k=0;
while(i<=n-1){
k+=10*i;
i++; }//循环了
n-1≈n次,所以是O(n)
(5) for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=j;k++)
x=x+1;
//
循环了(1^2+2^2+3^2+…+n^2)=n(n+1)(2n+1)/6(这个公式要记住哦)≈(n^3)/3,不考虑系数,自然是O(n^3)
另外,在时间复杂度中,log(2,n)(以2为底)与lg(n)(以10为底)是等价的,因为对数换底公式:
log(a,b)=log(c,b)/log(c,a)
所以,log(2,n)=log(2,10)*lg(n),忽略掉系数,二者当然是等价的
如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。例如:
for (i=1; i<=n; i++)
x++;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;
第一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为Ο(n2),则整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。
常见的算法时间复杂度由小到大依次为:
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)
- 如何计算程序时间复杂度(实战篇)
- 如何计算程序的时间复杂度
- 如何计算时间复杂度
- 如何计算时间复杂度
- 如何计算时间复杂度
- 如何计算时间复杂度
- 如何计算时间复杂度
- 如何计算时间复杂度
- 如何计算时间复杂度
- 时间复杂度如何计算
- 如何计算时间复杂度
- 如何计算时间复杂度
- 如何计算时间复杂度
- 如何计算时间复杂度
- 如何计算时间复杂度?
- 如何计算时间复杂度
- 如何计算时间复杂度
- 如何计算时间复杂度
- 安卓学习笔记---实现下拉图片放大,松开又自动回去效果 (ListView与ScrollView)
- 获取文件类型、扩展名
- java学习之swing和JFC
- JS中this的作用
- [Rails]表单提交时,post与patch的内部转化
- 如何计算程序时间复杂度(实战篇)
- Tunnel:论如何在内网中自由渗透 20160721
- 界门纲目科属种
- SSH对于web.xml的配置
- 关于Android Launcher3相关优秀文章的记录
- 揭秘:攻击者如何在Kali Linux中搭建钓鱼热点 20160720
- js时间戳转成date
- Express框架学习
- iOS9.0 以后状态栏动态显示与隐藏的解决办法!!!!!