1、大 O 复杂度表示法
- T(n): 代码执行时间
- n 表示数据规模的大小
- f(n) 表示每行代码执行的次数总和
- O表示代码的执行时间 T(n) 与 f(n) 表达式成正比
2、常见时间复杂度量级
- 常量阶:O(1)
- 线性阶:O(n)
- 对数阶:O(logn)
- 线性对数阶:O(nlogn)
- 平方阶:O(n^2),O(n^3)….
- 指数阶:O(2^n)
- 阶乘阶:O(2^n)
上面罗列的常见可以分为两类:多项式量级和非多项式量级。其中,非多项式量级只有两个:O(2^n) 和 O(n!)
我们把时间复杂度为非多项式量级的算法问题叫作 NP问题(Non-Deterministic Polynomial,非确定多项式),当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法。
3、时间复杂度分析
- 最坏情况时间复杂度:代码在最理想情况下执行的时间复杂度。
- 最好情况时间复杂度:代码在最坏情况下执行的时间复杂度。
- 平均时间复杂度:用代码在所有情况下执行的次数的加权平均值表示。
- 均摊时间复杂度:在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。
同一段代码在不同情况下时间复杂度会出现量级差异,为了更全面,更准确的描述代码的时间复杂度,所以引入这4个概念。代码复杂度在不同情况下出现量级差别时才需要区别这四种复杂度。大多数情况下,是不需要区别分析它们的。
