why

为了让程序执行的更快,也为了尽可能让程序所利用的空间更小
我们用一些特定的数据结构,和逻辑方法去达到这些目标
复杂度分析是为了对比这些方法和途径衡量的标准。

what

复杂度分析是我们在程序运行前评估算法执行效率方法
是不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法。

有时间和空间两个维度

时间复杂度分析

T(n) = O(f(n)) T(n) :代码执行的时间;
n 表示数据规模的大小;
f(n) 表示每行代码执行的次数总和。
O,表示代码的执行时间 T(n) 与 f(n) 表达式成正比。

大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。

当 n 很大时,公式中的低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略。我们只需要记录一个最大量级就可以。

分析的使用技巧

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

时间复杂度4种复杂度量级

最好情况时间复杂度(best case time complexity)

在最理想的情况下,执行这段代码的时间复杂度。

最坏情况时间复杂度(worst case time complexity)

在最糟糕的情况下,执行这段代码的时间复杂度。

平均情况时间复杂度(average case time complexity)

平均时间复杂度要注意每种情况出现的概率。

平均时间复杂度的全称应该叫加权平均时间复杂度或者期望时间复杂度。

均摊时间复杂度(amortized time complexity)。

均摊时间复杂度就是一种特殊的平均时间复杂度

每一次 O(n) 的插入操作,都会跟着 n-1 次 O(1) 的插入操作,所以把耗时多的那次操作均摊到接下来的 n-1 次耗时少的操作上,均摊下来,这一组连续的操作的均摊时间复杂度就是 O(1)。这就是均摊分析的大致思路。

同一段代码,在不同输入的情况下,复杂度量级有可能是不一样的。

空间复杂度分析

空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。

越高阶复杂度的算法,执行效率越低。常见的复杂度并不多,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2 )