一、常见的

1.线性的

T(n) = 3n,执行次数是线性的。

  1. public void eat(int n){
  2. for(int i=0; i<n; i++){;
  3. System.out.println("等待一天");
  4. System.out.println("等待一天");
  5. System.out.println("吃一寸面包");
  6. }
  7. }

2.对数的

T(n) =一、时间复杂度 - 图1,执行次数是对数的。

  1. int i=1;
  2. while(i<n){
  3. i=i*2;
  4. }

变形 T(n) =一、时间复杂度 - 图2,执行次数是对数的。

  1. int i=1;
  2. while(i<n){
  3. i=i*3;
  4. }

T(n) = 一、时间复杂度 - 图3,执行次数是对数的。(这种的一、时间复杂度 - 图4 2省略掉了)

  1. public void eat2(int n){
  2. for(int i=1; i<n; i*=2){
  3. System.out.println("等待一天");
  4. System.out.println("等待一天");
  5. System.out.println("等待一天");
  6. System.out.println("等待一天");
  7. System.out.println("吃一半面包");
  8. }
  9. }

线性对数阶O(nlogN)

将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),

  1. for(int m=1;m<n;m++){
  2. int i=1;
  3. while(i<n){
  4. i=i*2;
  5. }
  6. }

3.常量的

T(n) = 2,执行次数是常量的。

  1. public void eat3(int n){
  2. System.out.println("等待一天");
  3. System.out.println("吃一个鸡腿");
  4. }

4.多项式

T(n) = 0.5n^2 + 0.5n,执行次数是一个多项式。
(1+2+3+……+ n-1 + n = (1+n)*n/2 = 0.5n^2 + 0.5n。)

  1. public void eat4(int n){
  2. for(int i=0; i<n; i++){
  3. for(int j=0; j<i; j++){
  4. System.out.println("等待一天");
  5. }
  6. System.out.println("吃一寸面包");
  7. }
  8. }

平方阶

它的时间复杂度就是 O(n²)。

  1. for(int x=1;x<=n;x++){
  2. for(int i=1;i<=n;i++){
  3. j=i;
  4. j++;
  5. }
  6. }

二、渐进时间复杂线

如何推导出时间复杂度呢?有如下几个原则:

  1. 如果运行时间是常数量级,用常数1表示;
  2. 只保留时间函数中的最高阶项;
  3. 如果最高阶项存在,则省去最高阶项前面的系数。

一、线性的
T(n) = 3n
最高阶项为3n,省去系数3,转化的时间复杂度为:
T(n) = O(n)
一、时间复杂度 - 图5
二、对数的
T(n) = 5logn
最高阶项为5logn,省去系数5,转化的时间复杂度为:
T(n) = O(logn)
一、时间复杂度 - 图6
3.常量的
T(n) = 2
只有常数量级,转化的时间复杂度为:
T(n) = O(1)
一、时间复杂度 - 图7
4.多项式
T(n) = 0.5n^2 + 0.5n
最高阶项为0.5n^2,省去系数0.5,转化的时间复杂度为:
T(n) = O(n^2)
一、时间复杂度 - 图8
总结:
这四种时间复杂度究竟谁用时更长,谁节省时间呢?稍微思考一下就可以得出结论:
O(1)< O(logn)< O(n)< O(n^2)