时间复杂度理论中的记号

本文结合豆包AI生成。

时间复杂度理论中的核心渐近记号

时间复杂度的记号,本质是用来描述算法运行时间(或空间开销)随输入规模n增长的渐近行为(即n→∞时的增长趋势),核心是忽略常数因子和低阶项,主要关注的是增长量级的差异。


一、核心基础记号

这5个记号是渐近分析的基石,由高德纳(Donald Knuth)系统化规范,是所有算法复杂度分析的通用语言。

1. 大O记号(Big O,上界记号)

  • 数学定义f(n) = O(g(n)),当且仅当存在正常数Cn₀,使得对所有n ≥ n₀,满足 0 ≤ f(n) ≤ C·g(n)
  • 直观含义f(n)的增长速度不超过g(n),给算法开销一个上界,是日常描述算法最坏时间复杂度最常用的记号。
  • 示例3n² + 2n + 5 = O(n²)n log n = O(n²);我们通常取最紧的上界(比如不会把写成O(n³))。

2. 大Ω记号(Big Omega,下界记号)

  • 数学定义f(n) = Ω(g(n)),当且仅当存在正常数Cn₀,使得对所有n ≥ n₀,满足 0 ≤ C·g(n) ≤ f(n)
  • 直观含义f(n)的增长速度不低于g(n),给算法开销一个下界,常用于描述算法的最好情况,或某类问题的理论复杂度下界(比如基于比较的排序问题,复杂度下界为Ω(n log n))。
  • 示例3n² + 2n + 5 = Ω(n²),也可写为Ω(n),同样优先取最紧的下界。
  • 补充:与大O是对偶关系。

3. 大Θ记号(Big Theta,紧界记号)

  • 数学定义f(n) = Θ(g(n)),当且仅当同时满足 f(n) = O(g(n))f(n) = Ω(g(n))。等价于存在正常数C₁、C₂、n₀,对所有n≥n₀,满足 0 ≤ C₁·g(n) ≤ f(n) ≤ C₂·g(n)
  • 直观含义f(n)g(n)严格同阶增长,给出了算法开销的紧确界,上下界由同一个g(n)刻画。
  • 示例3n² + 2n + 5 = Θ(n²),但n² ≠ Θ(n³)n² ≠ Θ(n)
  • 补充:日常口语中说“算法复杂度是O(n²)”,多数场景实际指的是Θ(n²),只是习惯用大O代指。

4. 小o记号(Little o,非紧上界记号)

  • 数学定义f(n) = o(g(n)),当且仅当对任意正常数ε>0,存在n₀,使得对所有n≥n₀,满足 0 ≤ f(n) < ε·g(n)。等价于极限定义:lim(n→∞) f(n)/g(n) = 0
  • 直观含义f(n)的增长速度严格慢于g(n),是非紧的上界。大O是“≤”(包含同阶的可能),小o是“<”(严格低阶,无同阶可能)。
  • 示例2n = o(n²)(极限为0),但n² ≠ o(n²)(极限为1≠0);f(n)=O(f(n))永远成立,但f(n)=o(f(n))永远不成立。

5. 小ω记号(Little omega,非紧下界记号)

  • 数学定义f(n) = ω(g(n)),当且仅当对任意正常数C>0,存在n₀,使得对所有n≥n₀,满足 0 ≤ C·g(n) < f(n)。等价于极限定义:lim(n→∞) f(n)/g(n) = ∞
  • 直观含义f(n)的增长速度严格快于g(n),是非紧的下界。大Ω是“≥”(包含同阶的可能),小ω是“>”(严格高阶,无同阶可能)。
  • 示例n² = ω(n)(极限为∞),但n² ≠ ω(n²)(极限为1≠∞)。
  • 补充:与小o是对偶关系。

二、进阶常用记号

1. 软O记号(Soft O,Õ,O tilde)

  • 定义Õ(g(n)) = O(g(n) · log^k n),其中k为非负常数,即忽略对数因子的大O记号。
  • 直观含义:把对数级别的因子视作“近似常数”,简化复杂度表达,避免冗长的对数项。
  • 示例n log n = Õ(n)n log² n = Õ(n)n² log n = Õ(n²)
  • 补充:对应有软Ω(Ω̃)、软Θ(Θ̃)记号,定义逻辑一致,均忽略对数因子。

2. 渐近等价记号(~,Tilde记号)

  • 定义f(n) ~ g(n),当且仅当 lim(n→∞) f(n)/g(n) = 1
  • 直观含义:比大Θ更严格,不仅要求同阶,还要求主项的常数因子完全相等,用于算法的精细渐近分析。
  • 示例3n² + 2n + 5 ~ 3n²,而Θ(n²)不关心主项的常数因子。

3. 星号O记号(O*,参数化复杂度专用)

  • 定义O*(c^k) = O(c^k · poly(k)),其中poly(k)是关于参数k的多项式,即忽略多项式因子,仅关注指数核心项。
  • 适用场景:参数化算法、NP难问题的精确算法分析,核心是区分指数级的参数增长和可忽略的多项式开销。
  • 示例:子集和问题的动态规划算法复杂度可写为O*(2^k),其中k为子集大小。

三、补充说明

  1. 常用复杂度阶的增长速度排序:
    O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(n^k)(k≥3,多项式阶) < O(2^n)(指数阶) < O(n!)
  2. 大O不专属“最坏情况”,Ω也不专属“最好情况”:记号本身只描述增长趋势,只是行业习惯用大O描述最坏复杂度,用Ω描述问题下界。
posted @ 2026-04-26 15:28  wljss  阅读(32)  评论(0)    收藏  举报