`

什么是算法时间复杂度

 
阅读更多

问题:

1 + 2 + 3 + ...... + 100 = ?

 

算法1:

int sum=0;

int n=100;

for(int i=1;i<=n;i++){

  sum +=  i;

}

System.out.println(sum);

 

算法2:

int sum=0;

int n=100;

sum=(1 + n)*n/2;

System.out.println(sum);

 

影响算法效率的因素:

1.算法的内容

2.编译的质量                           依赖编译器

3.问题的规模

4.机器执行指令的速度             依赖硬件

 

可控的影响因素:

算法                   规模

       算法1          n

       算法2          n

 

一个算法的执行数量     f(n)                是n的一个函数

一个算法的时间复杂度 O(f(n))           是执行数量经过一个规则得到的结果

 

执行数量计算时间复杂度的规则:

       取最高项                                     影响f(n)数值变化的最主要因素

       去掉常量                                     随着n的增长,该值可忽略

       去掉最高项的系数                       随着n的增长,该值可忽略

       去掉低次项                                 随着n的增长,该值可忽略

       没有最高项,值为常量1

 

       3 --> O(1)

       n --> O(n)

       2n+1 --> O(n)

       n^2 + 3n + 1 --> O(n^2)

       log2 n --> O(log n)

 

算法1的时间复杂度:O(n)

算法2的时间复杂度:O(1)

 

int x = 0;

int sum = 0;

for(int i=1;i<=n;i++){

  for(int j=1;j<=n;j++){

    x++;

    sum += x;

  }

}

 

f(n) = n * n;

时间复杂度:O(n^2)

 

int x = 0;

int sum = 0;

for(int i=1;i<=n;i++){

  for(int j=i;j<=n;j++){

    x++;

    sum += x;

  }

}

 

f(n) = n + (n-1) + (n-2) + ...... +1 = (n + 1) * n / 2 = n^2/2 + n/2;

时间复杂度为:O(n2)

 

效率:

O(1) < O(log n) < O(n) < O(n*log n) < O(n^2) < O(n^3) < O(n!) ......

 

从f(n)转O(n)比较简单,问题是怎么计算f(n),需要数学的知识。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics