渐近记号

定义 设 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):NN,C0, s.t. nN,g(n)Cf(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.(n1)

因此 T_1,T_2,T_3\in\mathcal{O}\left(n\right)T1,T2,T3O(n),这便是三者的一个重要共性我们来看看 

\mathcal{O}O 的几个简单性质:

  • 一个最简单的事实是 f\in\mathcal{O}\left(f\right)fO(f)
  • 若 f\in\mathcal{O}\left(g\right)fO(g),则 Cf\in\mathcal{O}\left(g\right)CfO(g)
  • 若 f,g\in\mathcal{O}\left(h\right)f,gO(h),则 f+g\in\mathcal{O}\left(h\right)f+gO(h)
  • 若 f\in\mathcal{O}\left(g\right), g\in\mathcal{O}\left(h\right)fO(g),gO(h),则 f\in\mathcal{O}\left(h\right)fO(h)
  • 若 a\leq bab,则 n^a\in\mathcal{O}\left(n^b\right)naO(nb)
  • \mathcal{O}\left(1\right)\subsetneq\mathcal{O}\left(\log n\right)\subsetneq\mathcal{O}\left(n\right)\subsetneq 2^{\mathcal{O}\left(n\right)}O(1)O(logn)O(n)2O(n)

我们可以看到,\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.5O(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)fO(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)fo(g)gO(f);fO(g),gO(f);ε>0,N, s.t. nN,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 STCS(其中 CC 是一个正常数),用现在的语言说就是 S=\mathcal{O}\left(T\right)S=O(T),或者说 SS 被 TT 控制。正因为这样,本课程更关心算法的时间复杂度而不是空间复杂度:一个算法如果有很低的时间复杂度意味着它有很低的空间复杂度。

渐近记号_第1张图片


你可能感兴趣的:(算法分析与设计)