时间复杂度理论中的记号
本文结合豆包AI生成。
时间复杂度理论中的核心渐近记号
时间复杂度的记号,本质是用来描述算法运行时间(或空间开销)随输入规模n增长的渐近行为(即n→∞时的增长趋势),核心是忽略常数因子和低阶项,主要关注的是增长量级的差异。
一、核心基础记号
这5个记号是渐近分析的基石,由高德纳(Donald Knuth)系统化规范,是所有算法复杂度分析的通用语言。
1. 大O记号(Big O,上界记号)
- 数学定义:
f(n) = O(g(n)),当且仅当存在正常数C和n₀,使得对所有n ≥ n₀,满足0 ≤ f(n) ≤ C·g(n)。 - 直观含义:
f(n)的增长速度不超过g(n),给算法开销一个上界,是日常描述算法最坏时间复杂度最常用的记号。 - 示例:
3n² + 2n + 5 = O(n²),n log n = O(n²);我们通常取最紧的上界(比如不会把n²写成O(n³))。
2. 大Ω记号(Big Omega,下界记号)
- 数学定义:
f(n) = Ω(g(n)),当且仅当存在正常数C和n₀,使得对所有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为子集大小。
三、补充说明
- 常用复杂度阶的增长速度排序:
O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(n^k)(k≥3,多项式阶) < O(2^n)(指数阶) < O(n!) - 大O不专属“最坏情况”,Ω也不专属“最好情况”:记号本身只描述增长趋势,只是行业习惯用大O描述最坏复杂度,用Ω描述问题下界。

浙公网安备 33010602011771号