数据结构与算法之复杂度分析

344 阅读2分钟

复杂度

时间复杂度:表示算法的执行时间与数据规模之间的增长关系
空间复杂度:表示算法的存储空间与数据规模之间的增长关系

常见的时间复杂度:T(n) = O(f(n))T(n)表示代码的执行时间,f(n)表示每行代码执行的次数总和,O表示f(n)T(n)成正比。

时间复杂度

时间复杂度分为多项式量级非多项式量级

非多项式量级只有两个:O(2n) 和 O(n!)
当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法。

多项式量级

  • 常量阶:O(1) 只要代码的执行时间不随 n 增大,这样代码的时间复杂度为O(1)
  • 对数阶:O(logn) 常见在while 循环中
while (i <= n) {
  i = i * 2;
}

因为21 22 ... 2x = n,当2x = n时,x = log2n,x 的次数就是这段代码的时间复杂度,所以while语句中时间复杂度通常为O(log2n)

  • 线性阶:O(n)
  • 线性对数阶:O(nlogn)
  • 平方阶:O(n2)

越高阶复杂度的算法,执行效率越低,从低阶到高阶有:O(1)O(logn)O(n)O(nlogn)O(n2)

时间复杂度分析

如何分析一段代码的时间复杂度?

  1. 只关心循环执行次数最多的一段代码
  2. 总复杂度等于量级最大的那段代码的复杂度
  3. 嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

时间复杂度分为最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度、均摊时间复杂度

最好、最坏情况时间复杂度

最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。
最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。