定义 设 f\left(n\right)f(n) 是一个定义在 \mathbb{N}N(有时也可取 \mathbb{Z}_+Z+ 等,允许有有限个自然数处没有定义)上的函数,定义集合
\mathcal{O}\left(f\right)=\left\{{g\left(n\right):\exists N\in\mathbb{N},C\geq 0,\mathrm{\ s.t.\ }\forall n\geq N,\left|g\left(n\right)\right|\leq C\left|f\left(n\right)\right|}\right\}.O(f)={g(n):∃N∈N,C≥0, s.t. ∀n≥N,∣g(n)∣≤C∣f(n)∣}.
这个集合中的函数称为 “在 n\to\inftyn→∞ 时被 ff 控制的函数”。
回忆上一节介绍的三个算法,它们的时间复杂度分别是
\begin{array}{rcl}T_1\left(n\right)&=&n\ \leq\ n,\\T_2\left(n\right)&=&n+100\log n\ \leq\ 101n,\\T_3\left(n\right)&=&5n\ \leq\ 5n.\quad\left(n\geq 1\right)\end{array}T1(n)T2(n)T3(n)===n ≤ n,n+100logn ≤ 101n,5n ≤ 5n.(n≥1)
因此 T_1,T_2,T_3\in\mathcal{O}\left(n\right)T1,T2,T3∈O(n),这便是三者的一个重要共性我们来看看
\mathcal{O}O 的几个简单性质:
我们可以看到,\mathcal{O}O 这个记号忽略了系数和所谓的“低阶项”:
\begin{array}{rcl}2n+3\log n&\in&\mathcal{O}\left(n\right),\\n^2+2n&\in&\mathcal{O}\left(n^2\right),\\5n\log n+2n+13\log n&\in&\mathcal{O}\left(n\log n\right),\\n^{1.5}&\in&\mathcal{O}\left(n^2\right).\end{array}2n+3lognn2+2n5nlogn+2n+13lognn1.5∈∈∈∈O(n),O(n2),O(nlogn),O(n2).
作为 \mathcal{O}O 记号的结尾,我们指出,在实际使用中常常用 f=\mathcal{O}\left(g\right)f=O(g) 表示 f\in\mathcal{O}\left(g\right)f∈O(g)。大家不应该把这个等号理解为 相等,而是应该理解为 和右边集合中某个元素相等。
下一页我们快速地介绍另外几个常用的符号。定义 下面定义
\OmegaΩ、\ThetaΘ 和 oo(小 oo 记号):
\begin{array}{rcl}f\in\Omega\left(g\right)&\Longleftrightarrow&g\in\mathcal{O}\left(f\right);\\f\in\Theta\left(g\right)&\Longleftrightarrow&f\in\mathcal{O}\left(g\right),g\in\mathcal{O}\left(f\right);\\f\in o\left(g\right)&\Longleftrightarrow&\forall\varepsilon>0,\exists N,\mathrm{\ s.t.\ }\forall n\geq N, \left|f\left(n\right)\right|\leq \varepsilon\left|g\left(n\right)\right|.\end{array}f∈Ω(g)f∈Θ(g)f∈o(g)⟺⟺⟺g∈O(f);f∈O(g),g∈O(f);∀ε>0,∃N, s.t. ∀n≥N,∣f(n)∣≤ε∣g(n)∣.
\OmegaΩ 就是和 \mathcal{O}O 相反的关系,把 \mathcal{O}O 理解为“控制”的话,那么 \OmegaΩ 就是“被控制”的意思。
\ThetaΘ 关系的意思是两个函数互相“控制”,也就是常说的“差一个常数(因子)”。
oo 是一个比 \mathcal{O}O 更“强”(更“严格”)的关系:通俗地说,它要求 ff 的增加速度小于 gg 增加的速度,而 \mathcal{O}O 只要求 ff 的增加速度不超过 gg 增加的速度。
我们指出这些记号统称“渐近记号”,这是因为这些记号关心的是且仅是函数在自变量趋于无穷时的性态(即“渐近性质”)。
最后,回顾上一节,我们证明了在特定条件下,一个算法的时间复杂度 TT 和空间复杂度 SS 之间有关系 TC\geq STC≥S(其中 CC 是一个正常数),用现在的语言说就是 S=\mathcal{O}\left(T\right)S=O(T),或者说 SS 被 TT 控制。正因为这样,本课程更关心算法的时间复杂度而不是空间复杂度:一个算法如果有很低的时间复杂度意味着它有很低的空间复杂度。