时间复杂度

时间复杂度:

分为最优时间复杂度,最坏时间复杂度,平均时间复杂度。

       最优和平均并不能提供保证,反观最坏时间复杂度提供了一定保证,即保证在最坏时间复杂度下,算法一定能完成。因此,我们主要关注算法的最坏情况,一般在说到时间复杂度时,我们说的都是最坏时间复杂度。

时间复杂度的几条基本计算规则:

  • 基本操作,即只有常数项,认为其时间复杂度为O(1)
  • 顺序结构,时间复杂度按加法进行计算。比如一个算法复杂度为O(n)的结构和一个算法复杂度为O(n^2)的结构相加,即O(n^2 + n),简化为O(n^2)
  • 循环结构,时间复杂度按乘法进行计算,比如外层循环为进行n次,内层为从0加到100,那么内层的时间复杂度为O(100),外层要进行n次,则总体的时间复杂度为O(100n),简化为O(n)。
  • 分支结构,时间复杂度取最大值(之后会讲到)

常见时间复杂度

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

口诀:常 对 幂 指 阶

 主定理

在时间复杂度里有一种很复杂的计算,即递归计算。因为在求当前层的复杂度时,往往需要将下一层、下下一层的复杂度求解出来。为了能够快速计算递归算法的时间复杂度,可以使用主定理。

T(N) = aT(\frac{N}{b}) + O(n^{d})

其中

T(n): 代表当前层的时间复杂度。代表了将当前层的数据进行分解和将返回当前层的数据进行合并所需要的时间复杂度。(全部计算)

N:问题规模大小

a:递归中子递归的个数

N/b:每一部分子递归的数据规模

d:除子递归外的剩余操作步数(比如:调用!或其它运算,其中涉及函数。)

O(N^d):将原问题分解成子问题和将子问题的解合并成原问题的解的时间

时间复杂度_第1张图片

 使用魔法的方法:时间复杂度_第2张图片

 简单看一下第一层和第二层,比较下这两层的工作量,如果每层工作量是一样(如上图),则对应公比为1的情况,直接n^{d}logb^{n}

时间复杂度_第3张图片

 如果每层第一层工作量比第二层多(如上图),对应公比大于1的情况,直接n^{logb^{a}}

 如果第一层工作比第二层少,对应于公比小于1的情况,直接n^{d}

你可能感兴趣的:(排序算法,算法)