前言
第一篇介绍了时间复杂度为O(n)和O(n^2)的代码,接下来介绍一下详细介绍一下时间复杂度,以及时间复杂度为为O(1),O(logn),O(nlogn)的代码。
时间复杂度的介绍
一般来说,时间复杂度的比较
1.大O表示法
O表示的是程序运行时间随数据的增长趋势,并不是准确计算程序的运行时间,我们用来估算程序运行的时间,所以也叫渐进时间复杂度,简称时间复杂度。
2.时间复杂度的计算
只关注时间复杂度最大的那段
1.加法计算:总的时间复杂度为数量级最大的那段时间复杂度。
2.乘法计算:循环的嵌套,等于内外循环次数的乘积(外层循环,循环一次,内层循环,循环n次)
而且,不管常量的执行时间多大,我们都可以忽略掉,因为,它是关于n的函数,常量本身对增长趋势并没有影响。
3.代码展示
1. 时间复杂度为O(1)的代码,一般来说,如果代码中没有循环语句,递归语句,那么即使再多的代码,它的时间复杂度也是O(1)。
#include<stdio.h>
#include<math.h>
int main(){
int n;
double a,s;
scanf("%d%lf",&n,&a);
s=a*pow(1.0225,n);
printf("%.6f",s);
}
例如,这份代码的时间复杂度就为O(1),都为简单的加减乘除计算。
2.时间复杂度为O(logn)的代码
#include<stdio.h>
int main(){
int n,sum=1;
scanf("%d",&n);
while(sum<=n){
sum=sum*2;
}
}
假设,程序执行的次数为 t,每次循环sum都乘以2,那么2^t=n,运行次数t=log(2^n)。
3.时间复杂度为O(nlogn)的代码
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j+=i){
//do something with O(1)......
}
}
return 0;
}
这份代码的第一层循环,执行了n次,但第二层代码的执行时间与 i 的大小有关,也就是 n/i 次,
具体来说就是下面这个公式
有错误或者不够完善的地方,希望可以指正