1、大 O 复杂度表示法

复杂度分析(大O) - 图1

  • 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个概念。代码复杂度在不同情况下出现量级差别时才需要区别这四种复杂度。大多数情况下,是不需要区别分析它们的。