欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法的时间复杂度

程序员文章站 2022-05-23 10:41:23
...
算法的时间复杂度
    分析一个算法的好坏,时间复杂度是一个非常重要的标准。我们一般用O()表示一个算法的复杂度。
  常见的算法时间复杂度有(由小到大):
  
O(1)常数阶   O(logn)对数阶   O(n)线性阶   O(nlogn)   O(n^2)   O(n^3) 
| --------             p问题(时间复杂度为上)               -----------|

O(2^n)    O(n!)
|-NP问题(复杂度为上)-|

    计算时间复杂度可分为递归和非递归两种:

  举一个简单的例子:计算斐波拉契数列  f (n) = f (n-1) +f (n-2)   (n  <  45)
    有些人第一眼看到这个问题,觉得用递归十分方便,便毫不犹豫的用了递归(这是某大学的一个考研题,很多人采用了这种算法,但是当他们将程序提交上去,在规定时间内都未能给出答案,他们都觉得不知所云),其实当我们计算过时间复杂度后,出现这个问题的原因就一目了然了。

    如果我们采用递归的方式,那么我们设进入一次递归(一个基本操作)程序运行的时间为一个单位时间
故计算       T (n) = T (n-1) + T (n-2)  + 1
       变形  T (n) + 1 = T (n-1)  + 1 + T (n-2)  + 1
       令    B (n) = T (n)+1
       所以  B (n) = B (n-1) + B (n-2)
       可见 B (n) 也是一个斐波拉契数列
       所以时间复杂度 T (n) = B (n) -1 = f (n)
    当n = 45 时,斐波拉契数列的值在 2,100,000,000 ,这意味着当我们计算斐波拉契的第45项时,我们要执行21亿次基本操作,这是不可想象的!!!因为在递归的过程中执行了大量的无用的重复计算!!!

    如果我们采用非递归的方法递推的话,十分简单,时间复杂度为 O (n)

    我在这里并不是说递归的时间复杂度一定比非递归的时间复杂度高,而是说明对于同一个问题,有不同的算法去解决这个问题,我们在之前一定要分析算法的时间复杂度。否则我们写的程序对时间的开销是不可估量的。而我们在写递归的时候,要特别注意里面嵌套了多个递归的情况。