大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思
1 O、Ω、Θ 的定义
在数学、算法分析里,\(O\)、\(\Omega\)、\(\Theta\) 都是在描述两个函数的渐近增长速度,通常讨论 \(n\to\infty\) 时的关系。
最核心的区别是:
更严格地说,给定两个非负函数 \(f(n)\) 和 \(g(n)\)。
-
\(f(n)=O(g(n))\):存在常数 \(c>0,n_0\),使得对所有 \(n\ge n_0\),
\[f(n)\le c\,g(n). \]意思是:\(f\) 最终不会比 \(g\) 快超过一个常数倍。
-
\(f(n)=\Omega(g(n))\):存在常数 \(c>0,n_0\),使得对所有 \(n\ge n_0\),
\[f(n)\ge c\,g(n). \]意思是:\(f\) 最终至少有 \(g\) 这么快的增长量级。
-
\(f(n)=\Theta(g(n))\):存在常数 \(c_1,c_2>0,n_0\),使得对所有 \(n\ge n_0\),
\[c_1g(n)\le f(n)\le c_2g(n). \]也就是:
\[f(n)=O(g(n)) \quad\text{且}\quad f(n)=\Omega(g(n)). \]意思是:\(f\) 和 \(g\) 的增长速度是同一个数量级。
可以这样记:
| 符号 | 含义 | 直觉 |
|---|---|---|
| \(O(g(n))\) | 上界 | “最多这么快” |
| \(\Omega(g(n))\) | 下界 | “至少这么快” |
| \(\Theta(g(n))\) | 上下界一致 | “就是这个量级” |
如果画成一种直观的“夹住”关系:
2 举例
比如 \(f(n)=3n^2+10n+100\),那么:
因为它最终不会超过某个常数倍的 \(n^2\)。
同时:
因为它最终也至少是某个常数倍的 \(n^2\)。
因此,我们有:
注意,这里有一个容易混淆的点:我们常用的大 \(O\) 不等于“精确复杂度”。例如,上面的函数不仅有 \(f(n)=O(n^2)\),也完全可以说
这些都没错,因为它们都是上界,只是比较松。
相反,\(f(n)=\Theta(n^2)\) 表达的信息更强:它明确告诉你真正的渐近数量级就是 \(n^2\)。
再举一个例子,例如:
是对的,因为
在 \(n\ge1\) 时成立。
但是
因为 \(n\) 和 \(n^2\) 并不是同一个增长量级。
反过来:
也是正确的。
3 另外一个判断方式:看 n → ∞ 的极限
另外一个很有用的判断方式是看极限。如果
那么通常可以直接得到
例如:
所以
在算法里,如果一个程序运行时间是
最准确的渐近描述通常是
而说 \(T(n)=O(n^2)\) 只是给出了它的上界。

浙公网安备 33010602011771号