一、概念
- 时间复杂度:随着n的不断变化,T(n)/f(n)逐渐趋近于一个常数,我们使用O(f(n))来表示时间复杂度
我的理解就是:
时间复杂度就是: 程序循环体内,执行次数最多的语句的执行次数,若并列的循环,则将并列循环的时间复杂度相加。
时间复杂度排序:
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)
- 步骤:
1.首先找到执行次数最多的基本语句,一般都是在最内层循环的循环体内
2.查看该基本语句执行的次数
3.对于并列循环,则把复杂度相加,得出最后该程序的时间复杂度
(保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数)
- 示例:
时间复杂度:O(1)
核心:n是不变的,就执行固定次数,有限的;
Ο(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环语句,其时间复杂度就是Ο(1)
int sum=0,n=100; //执行一次
sum=(1+n)*n/2; //执行一次
System.out.println(sum); //执行一次
时间复杂度:O(log2n)
i一次增长2倍,也就是说,超过n需要执行多少次语句,即为时间复杂度。通过计算2^i=n,得到i=logn.所以时间复杂度为对数阶O(logn).
int i = 1;
while(i < n){
i * = 2;
}
时间复杂度:O(n)
n是因为一次增长一步,n次后执行完了这条语句,所以为O(n)
例子1:
int b =0;
for(int i = 0; i < n; i++){
b++;
}
例子2:
int i,sum=0,n=100; //执行一次
for(i=1;i<=n;i++) //执行n+1次
{
sum=sum+i; //执行n次
}
System.out.println(sum); //执行一次
时间复杂度:O(n2)
例子1:
for (i=1; i<=n; i++){
for (j=1; j<=n; j++)
{x++;}
}
例子2:
int i,j,x=0,sum=0,n=100; //执行一次
for(i=1;i<=n;i++){ //执行n+1次
for(j=1;j<=n;j++){ //执行n*(n+1)次
x++; //执行n*n次
sum=sum+x;
}
}
System.out.println(sum); //执行一次
这段代码执行了2n^2+2n+3次,即O(n2),随着这段代码重复被执行的次数增多,随着n值增大,时间效率会爆炸式增长。
小结:
- O(1)常数阶:每条语句的频度都是1,算法的执行时间不随着问题规模n增大而增长,即使有上千条语句,其执行时间也不过是一个比较大的常数。
- O(n)线性阶:有一个n次循环的循环语句。随着n增长执行时间线性增长。
- O(n^2)平方阶:循环中嵌套一个循环的情况。
- 时间复杂度大小体现: