什么是时间复杂度?
时间复杂度从名字上来说就是时间的复杂程度,实际上也就是一个算法中每条语句的理论上的执行时间总和。对于不同的程序它们的时间复杂度就会不同,时间复杂度用O表示。
时间复杂度重要吗?为什么重要?
对于一个算法而言,去评论它的好坏,不只是这个算法能不能解决问题,还有是不是有效率,而这里的效率有很大一部分是由这个时间复杂度决定的。对于计算机而言,复杂的算法会占用很多计算机资源,那么一个大的程序,如果每个算法都不够好,计算机在运算时就会出现卡住,我们所使用的程序的流畅性就破坏,那么这个程序就不会被接受。
如果你参加过一些算法竞赛,完成题目的条件不只是能够解答出问题,在判题系统中还有一个 Time limit exceeded程序超时。如果出现这种情况,你的程序不能过。
综上,时间复杂度对于一个算法,一个程序来说是至关重要的。
如何计算时间复杂度?
那么如何计算时间复杂度呢?这里需要提到一个名词时间频度:(一个算法中,语句执行的次数,被称为时间频度)用T(n)表示。
时间复杂度的定义计算
下面给出时间复杂度定义的计算方法:存在某个辅助函数f(n),当n->∞时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记做T(n)=O(f(n)),则称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
简单的来说,时间复杂度就是取T(n)中的最高阶。例如:T(n)=n^4 + 100*n +50,那么O(n)=n^4。
计算需要注意的地方:
- 关注循环次数最多的一段代码
- 加法法则:总复杂度等于量级最大的那段代码的复杂度
- 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
示例
对于时间复杂度,有很多种类,我主要讲一下O(1),O(n),O(n^2),O(log n)这四种。
O(1)常数
int a;
cin>>a;
cout<<a+1<<endl;
这就是一个简单是输入输出,T(n)=3,那么时间复杂度就是:O(1);
O(n) 线性
int n;
cin>>n;
for(int i=0;i<n;i++){
cout<<i*2<<endl;
}
对于这个段代码,我们可以看到这里有两个循环,因为这个程序只有一个循环,所以T(n)=3+3*n,那么时间复杂度就是O(n)。
O(n^2)平方
int m,n,sum1=0,sum2=0;
cin>>m>>n;
for(int i=0;i<m;i++){
sum1+=i;
for(int j=0;j<n;j++){
sum2+=j;
}
}
对于这段代码,可以知道sum1的频度是n,sum2的频度是n^2, 总频度是T(n)=2+4n+3n2。所以时间复杂度为O(n2)。
O(logn)对数
int i = 1;
cin>>i;
while(i<=n){
i*=2
}
这里可以理解为,2T(n)=n,那么T(n)=logn,所以时间复杂度为O(logn),如果把i=2改为i*=5那么时间复杂度为O(log5 n)。
结语
对于一个程序猿,时间复杂度是个非常重要的东西,我们从初学时就应该能够掌握它。
最后呢,有什么不足的地方,请大家多多指教。