Skip to content

渐近记号

Asymptotic notation · Big O notation

忽略常数和低阶项,比较函数在输入趋于无穷时的增长速度。

条目类型
定义

形式陈述

在算法分析中,输入规模 n 取自自然数N;设 f,g:NR0 是最终非负的资源函数。定义

fO(g)c>0n0nn0:0f(n)cg(n).

对偶地,fΩ(g) 表示存在 c>0,n0,使所有 nn0 都有 f(n)cg(n);同时属于 O(g)Ω(g) 时记为 fΘ(g)。严格渐近关系的量词为

fo(g)c>0 n0 nn0,f(n)cg(n),

以及

fω(g)c>0 n0 nn0,f(n)cg(n).

g 最终为正时,二者分别等价于 f(n)/g(n)0f(n)/g(n)

若要对可取负值的一般实函数使用 O,则以 |f(n)|c|g(n)| 为定义,其他关系也须明确符号条件。本库的复杂度语境默认前一种非负资源函数约定。

量词顺序决定了常数可以依赖什么。若 f(n;θ) 还带有参数 θ,写“对每个固定 θf(;θ)O(g)”允许 c,n0θ 改变;若要求对所有 θ 一致成立,就必须在量化 θ 之前选定同一组 c,n0。把一个增长参数吸进常数,往往正是错误复杂度结论的来源。

直觉

常数 c 吸收机器、语言与实现的固定倍率差异,起点 n0 则忽略有限多个小输入上的反常。这使比较聚焦于输入放大时成本如何增长,得到 lognnnlognn22n 这类结构性层次。O(g) 只是上界函数类,紧确的同阶结论应写成 Θ(g)

O、Omega 与 Theta 的边界
例子与边界

3n2+5n+7Θ(n2):当 n1 时,3n23n2+5n+715n2。换底公式说明 loganΘ(logbn),所以对数复杂度通常不写底;指数的底则不能忽略,因为 2no(3n)。函数也无须单调。例如 f(n)=n2+nsinn 虽有振荡,当 n2 时仍有

12n2n2nf(n)n2+n32n2,

因而 fΘ(n2)。又有 nlogno(n3/2),因为 logn/n0。只写 nlognO(n3/2) 虽正确,却丢失了比值趋零这一更强信息。

nO(n2) 为真但不紧,因而上界不能单独证明最优性。“f=O(g)”是常见的历史写法,实质是成员关系 fO(g),不可交换或移项;本库优先使用成员记法。定义也允许 cn0 大得惊人:常数因子为 109Θ(n) 实现在一切现实规模上都可能输给常数温和的 Θ(nlogn) 实现。渐近优势只是“最终”的承诺,现实输入仍受常数、内存层次和实现成本影响。

推论与应用

渐近记号为时间空间摊还成本提供统一的增长率语言,但它不会替分析者选择资源模型。最坏、期望、高概率和摊还是不同的量化维度;即使它们都得到 O(n),结论也不相同。通信位数、oracle 查询次数与机器指令同样不能只因量纲都写成一个整数就直接比较。

多参数界应保留真正会变化的参数,并说明趋近区域。比如

T(n,ε)=O(nlog1ε)

可以表示存在与 n,ε 均无关的 c,n0,使定理规定范围内的所有 nn00<εε0 都满足该界;也可能只表示固定 ε 后关于 n 的上界,此时隐藏常数允许依赖 ε。两种陈述必须用量词、下标或文字区分。类似地,若复杂度还依赖字长、块大小、输出大小或错误概率,省略参数只在它已被明确固定时才安全。

因此,“某问题需要 Ω(n)”必须同时交代 n 表示什么、计算单位是什么、其他参数如何量化。对多变量函数也没有唯一的“趋于无穷”:可以要求各坐标独立增长,也可以限定在 mn2 之类的区域内。定义域和常数依赖关系都是渐近结论的一部分,而不是排版细节。

参考资料
  • Thomas H. Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, Chapter 3.
  • Donald E. Knuth, “Big Omicron and Big Omega and Big Theta,” 1976.
关系图谱115 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系