大 O 记号是数学中的一种记号,用于表示:当自变量趋近某个指定的极限时,一个函数的绝对值不超过另一个函数的常数倍。在计算机科学中,它通常用来描述算法的运行时间或内存需求如何随输入规模增大而增长。它表示的是渐近上界,不一定是确切的增长速率,并且忽略常数因子以及相关极限区域之外的行为。(xlinux.nist.gov)
形式定义
设函数 和 在充分大的正整数上有定义,且当 充分大时,。表达式
表示存在常数 和 ,使得
这些常数不能依赖于 。对于取值非负的资源计数函数,可以省略绝对值符号。由于设有阈值,即使这一不等式对有限多个较小的输入不成立,也不影响该上界的有效性。(xlinux.nist.gov)
更一般地,在数学分析中, 时的 表示:在相关极限附近,凡是比值有定义的地方, 都保持有界。自变量可以趋于无穷大、零或其他点,不一定代表输入规模。(dlmf.nist.gov)
严格来说, 表示满足该上界条件的一组函数,因此写成 能更明确地表达其含义。惯用写法 中的等号并不表示通常意义上具有对称性的相等关系:不能将这个表达式反过来,推断出 。(ocw.mit.edu)
示例与运算规则
考虑多项式
当 时,,因此 。它也属于 ,这说明一个有效的上界未必是最能准确反映增长情况的上界。常数因子和低次项不会改变多项式的主要增长阶。(xlinux.nist.gov)
当用于比较的函数在自变量充分大时非负,上述定义可导出以下实用规则:
- 若 且 ,则 。
- 在相同假设下,。
- 若 且 ,则 。
- 乘以一个固定的非零常数,不会改变函数所属的大 O 类。(cs.yale.edu)
这些规则必须应用于实际的操作次数。嵌套循环并不必然意味着平方时间复杂度:循环的迭代次数和循环体的执行成本共同决定了总工作量。(introcs.cs.princeton.edu)
算法分析与增长类别
在计算复杂性中,大 O 记号用于描述在指定的输入规模度量和计算模型下,资源使用量的增长情况。时间复杂度衡量操作次数,而空间复杂度衡量存储需求。因此,同一种数据结构或算法的时间上界与空间上界可能不同。(xlinux.nist.gov)
假设基本操作的成本为常数,常见的上界如下:
| 上界 | 通常描述 | 示例 |
|---|---|---|
| 常数阶 | 通过下标访问数组元素 | |
| 对数阶 | 在有序数组中进行[[binary-search | |
| 线性阶 | 扫描所有元素 | |
| 线性对数阶 | [[merge-sort | |
| 平方阶 | 检查每一对元素 | |
| 指数阶 | 枚举 个元素的所有子集 |
只要对数的底是大于一的固定值,改变底数就只会引入一个常数因子,因此不会改变这些大 O 类。(cs.princeton.edu)
使用递归的算法通常会产生递推关系。例如,归并排序的分治法结构产生的递推关系包含两个规模减半的子问题,以及线性成本的合并工作,由此得到 的时间上界。(introcs.cs.princeton.edu)
大 O 本身并不意味着“最坏情况”。只要明确所约束的函数,上界就可以描述最坏情况、最好情况或平均情况下的成本。关于平均情况的结论需要对输入作出假设;而随机化算法的期望上界则可以通过对算法内部的随机选择取平均来得到。(algs4.cs.princeton.edu)
相关渐近记号
若干相关符号用于区分不同类型的比较。对于自变量充分大时为正的函数:
- 大 Ω 记号,,表示渐近下界。
- 大 Θ 记号,,表示同时存在由正的常数倍给出的上界和下界。
- 小 o 记号,,表示 。
- 渐近等价,,表示 。(cs.yale.edu)
因此, 比仅仅说它属于 更为精确,而 则表示前者的增长阶严格低于后者。如果 的极限是有限的正数,就能确定一个 Θ 界;但大 O 上界并不要求这一比值收敛。(ocw.mit.edu)
近似误差与解释上的局限
在渐近展开中,大 O 可以用来表示余项的大小。例如,
表示在充分接近零的地方,差值 的绝对值不超过 的某个常数倍。与自变量趋于无穷大时的运行时间上界不同,这里描述的是趋于零的误差。(dlmf.nist.gov)
渐近运行时间上界并不直接给出以秒为单位的执行时间。常数因子、实现细节和机器特性都会影响实际性能;渐近上界更小,也不意味着对每一种有限的输入规模都执行得更快。输入的表示方式同样重要:存储的数据项数量与编码这些数据项所需的比特数,是两种不同的规模度量。(introcs.cs.princeton.edu)