一、概念

  1. 时间复杂度:随着n的不断变化,T(n)/f(n)逐渐趋近于一个常数,我们使用O(f(n))来表示时间复杂度

我的理解就是:
时间复杂度就是: 程序循环体内,执行次数最多的语句的执行次数,若并列的循环,则将并列循环的时间复杂度相加。
时间复杂度排序:
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)

  1. 步骤:

1.首先找到执行次数最多的基本语句,一般都是在最内层循环的循环体内
2.查看该基本语句执行的次数
3.对于并列循环,则把复杂度相加,得出最后该程序的时间复杂度
(保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数)

  1. 示例:

时间复杂度: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值增大,时间效率会爆炸式增长。


小结:

  1. O(1)常数阶:每条语句的频度都是1,算法的执行时间不随着问题规模n增大而增长,即使有上千条语句,其执行时间也不过是一个比较大的常数。
  2. O(n)线性阶:有一个n次循环的循环语句。随着n增长执行时间线性增长。
  3. O(n^2)平方阶:循环中嵌套一个循环的情况。
  4. 时间复杂度大小体现:
    程序的时间复杂度_执行时间