算法设计与分析


函数的增长

计算机学院 张腾

tengzhang@hust.edu.cn

插入排序 vs. 归并排序

CPU 算法 时间复杂度
计算机 A $10^{10}$条指令/秒 插入排序 $2 \cdot n^2$
计算机 B $10^7$条指令/秒 归并排序 $50 \cdot n \lg n$
  1. 插入排序时间复杂度中的常数因子仅为归并排序的$2/50 = 1/25$
  2. 插入排序所在的计算机 A 的硬件比归并排序的快$10^{10} / 10^7 = 1000$倍

对长度一千万的数组进行排序,$n = 10^7$

\begin{align} \frac{2 \cdot (10^7)^2 \class{base01}{\text{指令}}}{10^{10} \class{base01}{\text{指令/秒}}} > 5.5 \class{base01}{\text{小时}}, \quad \frac{50 \cdot 10^7 \lg 10^7 \class{base01}{\text{指令}}}{10^7 \class{base01}{\text{指令/秒}}} < 20 \class{base01}{\text{分钟}} \end{align}

  • 问题规模$n$达到一定程度后,时间复杂度中关于$n$的部分会成为算法最终性能表现的决定性因素
  • 我们感兴趣的恰恰是大规模问题 (小问题上不同算法的表现拉不开差距)
渐进

某个性质渐进成立:$\exists n_0 > 0$使得对$\forall n \ge n_0$,该性质成立

  • 允许在开始的有限区间上不成立
  • 一定存在一个临界点,过了之后,在无限的区间上一直成立

例:函数渐进非负:$\exists n_0 > 0$使得对$\forall n \ge n_0$,函数取值非负

例:$f(n) = \class{blue}{\Theta} (n^2)$:$\exists n_0 > 0$使得对$\forall n \ge n_0$,$f(n)$和二次函数$n^2$的增长速度一样快

除了表示一样快 (相等关系) 的$\Theta$,还有表示不等关系的$O$、$\Omega$、$o$、$\omega$

相等关系 不等关系 严格不等关系
函数 $\Theta$ $O$ $\Omega$ $o$ $\omega$
数 $=$ $\le$ $\ge$ $<$ $>$
本讲内容

引入 5 个渐进界刻画算法的渐进效率

含义 渐进上界 渐进下界 渐进紧确界 非紧确渐进上界 非紧确渐进下界
符号 $O$ $\Omega$ $\Theta$ $o$ $\omega$

渐进界的严格定义

渐进界的各种性质和相互关系

渐进上界 渐进下界

渐进上界$O(g(n))$表示渐进意义下所有小于等于$g(n)$某个常数倍的非负函数,用于表示算法在最坏情况下的时间复杂度

\begin{align} O(g(n)) = \{ f(n) \mid \exists c, n_0 > 0 ~ \forall n \ge n_0 : 0 \le f(n) \le c g(n) \} \end{align}

渐进下界$\Omega(g(n))$表示渐进意义下所有大于等于$g(n)$某个常数倍的非负函数,用于表示算法在最好情况下的时间复杂度

\begin{align} \Omega(g(n)) = \{ f(n) \mid \exists c, n_0 > 0 ~ \forall n \ge n_0 : 0 \le c g(n) \le f(n) \} \end{align}

两点说明:

  1. $O(g(n))$和$\Omega(g(n))$是函数集合,$g(n)$本身也需渐进非负,否则集合为空
  2. $f(n) \in O(g(n))$记为$f(n) = O(g(n))$,$f(n) = \Omega(g(n))$同理,方便运算

$\exists$表示“存在”,Exist首字母“E”的左右翻转;$\forall$表示“任意/所有”,All首字母“A”的上下翻转

多项式的渐进界

对$d$阶多项式$p(n) = a_d n^d + a_{d-1} n^{d-1} + \cdots + a_1 n + a_0$,其中$a_d > 0$

记$q(n) \triangleq \frac{p(n)}{n^d} = a_d + \frac{a_{d-1}}{n} + \cdots + \frac{a_1}{n^{d-1}} + \frac{a_0}{n^d} \xrightarrow{~ n \rightarrow \infty ~} a_d$

根据极限定义,对$\forall \epsilon > 0$,存在$n_0$使得对$\forall n \ge n_0$有$|q(n) - a_d| \le \epsilon$

取$\epsilon = a_d/2$可得

\begin{align} \frac{a_d}{2} \le q(n) \le \frac{3 a_d}{2} \Longrightarrow \frac{a_d}{2} n^d \le p(n) \le \frac{3 a_d}{2} n^d \end{align}

  • 取$c = 3 a_d/2$、$n_0 = \max \{ n_0, 1 \}$,有$p(n) = O(n^{k_2})$其中$k_2 \ge d$
  • 取$c = a_d/2$、$n_0 = \max \{ n_0, 1 \}$,有$p(n) = \Omega(n^{k_1})$其中$k_1 \le d$

这也印证了上一讲提到的:多项式的低阶项在其渐进界中可忽略

渐进紧确界

渐进紧确界$\Theta(g(n))$表示渐进意义下所有介于$g(n)$某两个常数倍之间的非负函数,用于表示算法在最坏情况和最好情况下的时间复杂度一样,最多差个常数因子

\begin{align} \Theta(g(n)) = \{ f(n) \mid \exists c_1, c_2, n_0 > 0 ~ \forall n \ge n_0 : 0 \le c_1 g(n) \le f(n) \le c_2 g(n) \} \end{align}

定理:$f(n) = \Theta(g(n))$等价于$f(n) = O(g(n))$且$f(n) = \Omega(g(n))$

证明:

\begin{align} \Longrightarrow: \quad & \Theta : \exists c_1, c_2, n_0 > 0 \ldots \Longrightarrow \begin{cases} O : \exists c_2, n_0 > 0 \ldots \\ \Omega : \exists c_1, n_0 > 0 \ldots \end{cases} \\ \Longleftarrow: \quad & \begin{cases} O : \exists c_2, n_2 > 0 \ldots \\ \Omega : \exists c_1, n_1 > 0 \ldots \end{cases} \Longrightarrow \Theta : \exists c_1, c_2, n_0 = \max\{ n_1, n_2 \} > 0 \ldots \end{align}

多项式的渐进界

对$p(n) = \sum_{i=0}^d a_i n^i, ~ (a_d > 0)$,同时有$p(n) = O(n^d)$和$p(n) = \Omega(n^d)$成立,因此$p(n) = \Theta(n^d)$

综上,$p(n) = \begin{cases} O(n^k), & k \ge d \\ \Omega(n^k), & k \le d \\ \Theta(n^k), & k = d \end{cases}$

使用渐进界时我们应力求精确、简洁

例如对$T(n) = 3 n^2 - 10 n$,应将其写为$T(n) = \Theta(n^2)$

  • 不应写成$T(n) = O(n^{2.5})$或$T(n) = \Omega(n^{1.5})$,这不精确,虽然是对的
  • 也不应写成$T(n) = \Theta(n^2 + n)$,这不简洁,虽然也是对的
非紧确渐进上界

非紧确渐进上界$o(g(n))$定义如下:

\begin{align} o(g(n)) = \{ f(n) \mid \class{blue}{\forall c > 0} ~ \exists n_0 > 0 ~ \forall n \ge n_0 : 0 \le f(n) \class{blue}{<} c g(n) \} \end{align}

对比渐进上界$O(g(n))$,两点区别

  1. $\class{blue}{\exists} c > 0$变成了$\class{blue}{\forall} c > 0$
  2. $0 \le f(n) \class{blue}{\le} c g(n)$变成了$0 \le f(n) \class{blue}{<} c g(n)$

顾名思义,$o(g(n)) = O(g(n)) \setminus \Theta(g(n))$

  • 对$c$任取某个固定的正常数,可知$o \subseteq O$
  • $\forall c > 0 : f(n) < c g(n) \Longleftrightarrow \not \exists c > 0 : f(n) \ge c g(n)$,从而$o \cap \Theta = \emptyset$

例:$2n = o(n^2)$,$2n \ne o(n)$

非紧确渐进上界

由$o(g(n)) = \{ f(n) \mid \class{blue}{\forall c > 0} ~ \exists n_0 > 0 ~ \forall n \ge n_0 : 0 \le f(n) \class{blue}{<} c g(n) \}$

\begin{align} \class{blue}{\forall c > 0} : 0 \le \lim_{n \rightarrow \infty} \frac{f(n)}{g(n)} < c \Longleftrightarrow \lim_{n \rightarrow \infty} \frac{f(n)}{g(n)} = 0 \end{align}

$f(n) = o(g(n))$表示在渐进意义下$f(n)$的增长速度严格慢于$g(n)$

  • 有的算法教材会用$\lim_{n \rightarrow \infty} f(n)/g(n) = 0$来定义$o(\cdot)$,在$f(n)$渐进非负的前提下两者等价
  • 根据极限定义,对$\forall c > 0$存在$n_0$使得对$\forall n \ge n_0$有$|f(n)/g(n) - 0| < c$,若$f(n)$渐进非负,则$0 \le f(n) < c g(n)$

对数函数$<$多项式函数$<$指数函数$<$阶乘函数:

  • 对$\forall a > 0$和$b$有$\lim_{n \rightarrow \infty} \lg^b n/n^a = 0$,于是$\lg^b n = o(n^a)$
  • 对$\forall a > 1$和$b$有$\lim_{n \rightarrow \infty} n^b/a^n = 0$,于是$n^b = o(a^n)$
  • 对$\forall a > 0$有$\lim_{n \rightarrow \infty} a^n/n! = 0$,于是$a^n = o(n!)$
非紧确渐进下界

非紧确渐进下界$\omega(g(n))$对比$\Omega(g(n))$同样是两点区别

\begin{align} \omega(g(n)) & = \{ f(n) \mid \class{blue}{\forall c > 0} ~ \exists n_0 > 0 ~ \forall n \ge n_0 : 0 \le c g(n) \class{blue}{<} f(n) \} \\[4px] & \Longrightarrow \class{blue}{\forall c > 0} : c < \lim_{n \rightarrow \infty} \frac{f(n)}{g(n)} \Longleftrightarrow \lim_{n \rightarrow \infty} \frac{f(n)}{g(n)} = \infty \end{align}

$f(n) = \omega(g(n))$表示在渐进意义下$f(n)$的增长速度严格快于$g(n)$

对称的有$\omega(g(n)) = \Omega(g(n)) \setminus \Theta(g(n))$

  • 对$c$任取某个固定的正常数,可知$\omega \subseteq \Omega$
  • $\forall c > 0 : c g(n) < f(n) \Longleftrightarrow \not \exists c > 0 : f(n) \le c g(n)$,从而$\omega \cap \Theta = \emptyset$

例:$2 n^2 = \omega (n)$,$2 n^2 \ne \omega(n^2)$

$\lim_{n \rightarrow \infty} f(n) / g(n) = \infty$在数学上是不严谨的写法,这里只是为了与$o$的$\lim_{n \rightarrow \infty} f(n) / g(n) = 0$对应

多项式的渐进界

对$p(n) = \sum_{i=0}^d a_i n^i, ~ (a_d > 0)$,记$q(n) \triangleq \frac{p(n)}{n^d} \xrightarrow{~ n \rightarrow \infty ~} a_d$

若$k > d$,$\lim_{n \rightarrow \infty} \frac{p(n)}{n^k} = \lim_{n \rightarrow \infty} \frac{q(n)}{n^{k-d}} = 0 \Longrightarrow p(n) = o(n^k)$

若$k < d$,$\lim_{n \rightarrow \infty} \frac{p(n)}{n^k} = \lim_{n \rightarrow \infty} q(n) n^{d-k} = \infty \Longrightarrow p(n) = \omega(n^k)$

综上,$p(n) = \begin{cases} O(n^k), & k \ge d \\ \Omega(n^k), & k \le d \\ \Theta(n^k), & k = d \\ o(n^k), & k > d \\ \omega(n^k), & k < d \end{cases}$

表达式中的渐进界

若等式右边为渐进界,如$3 n^2 = \Theta(n^2)$,表示等号左边的函数$\in$等号右边的函数集合

若渐进界作为表达式中的一项,如$T(n) \le T(n-1) + \Theta(n)$,表示匿名函数,即存在$f(n) \in \Theta(n)$使得$T(n) \le T(n-1) + f(n)$

  • 函数名$f$及其精确形式不重要,不影响$T(n)$的渐进行为
  • 实际求$T(n)$时,根据问题对$\Theta(n)$予以具体化

多个匿名函数,如$2 n^2 + 3 n + 1 = 2 n^2 + \Theta(n) = \Theta(n^2)$

  • 第一个等号表示存在$f(n) \in \Theta(n)$使得$2 n^2 + 3 n + 1 = 2 n^2 + f(n)$
  • 第二个等号表示对任意$g(n) \in \Theta(n)$,存在$h(n) \in \Theta(n^2)$使得$2 n^2 + g(n) = h(n)$,先左后右,左边任意,右边存在,右适配左
表达式中的渐进界

若渐进界中的$g(n)$为常数,如$f(n) = O(1)$

  • $f(n)$有个正常数为其渐进上界
  • 常数时间复杂度一般指单个步骤,算法的整体时间开销通常不会与$n$无关

如何理解当$n<3$时$T(n) = O(1)$?

  • $n<3$的限定和$O$的渐进性是个矛盾,因为$O$对应的$n_0$可能大于$3$
  • 此时忽略$O$的渐进意义,即存在正常数$c$使得当$n<3$时$T(n) \le c$

累加中的渐进界,如$\sum_{i=1}^n \Theta (i)$,表示的是$\sum_{i=1}^n (a i + b)$,而不是$\Theta (1) + \Theta (2) + \cdots + \Theta (n)$,后者甚至不是良定义的

若不致引起误解,尽可能滥用 (abuse) 符号,可以简化表达

渐进界的相互关系

等价关系 非严格偏序关系 严格偏序关系
函数 $\Theta$ $O$ $\Omega$ $o$ $\omega$
数 $=$ $\le$ $\ge$ $<$ $>$

基于此类比易知有

自反性 对称性 转置对称性 传递性
$\Theta$ ✓ ✓ ✗ ✓
$O$ ✓ ✗ ✓ ✓
$\Omega$ ✓ ✗ ✓ ✓
$o$ ✗ ✗ ✓ ✓
$\omega$ ✗ ✗ ✓ ✓
自反性

求证:$f(n) = \Theta(f(n))$、$f(n) = O(f(n))$、$f(n) = \Omega(f(n))$

证明

证明:$f(n)$渐进非负,设临界点为$n_f$,易知对$\forall n \ge n_f$有

\begin{align} 0 \le 1 \cdot f(n) \le f(n) \le 1 \cdot f(n) \end{align}

取$c_1 = c_2 = 1$、$n_0 = n_f$即有$f(n) = \Theta(f(n))$

由$f(n) = \Theta(f(n)) \Longleftrightarrow \begin{cases} f(n) = O(f(n)) \\ f(n) = \Omega(f(n)) \end{cases}$可知$O$、$\Omega$自反性成立

对称性

求证:$f(n) = \Theta(g(n)) \Longleftrightarrow g(n) = \Theta(f(n))$

证明

证明:

\begin{align} & f(n) = \Theta(g(n)) \\[4pt] \Longleftrightarrow ~ & \exists c_1, c_2, n_0 > 0 ~ \forall n \ge n_0 : 0 \le c_1 g(n) \le f(n) \le c_2 g(n) \\[4pt] \Longleftrightarrow ~ & \exists c_1, c_2, n_0 > 0 ~ \forall n \ge n_0 : 0 \le f(n) / c_2 \le g(n) \le f(n) / c_1 \\[4pt] \Longleftrightarrow ~ & \exists d_1 = 1 / c_2, d_2 = 1 / c_1, n_0 > 0 ~ \forall n \ge n_0 : 0 \le d_1 f(n) \le g(n) \le d_2 f(n) \\[4pt] \Longleftrightarrow ~ & g(n) = \Theta(f(n)) \end{align}

转置对称性

求证:$f(n) = O(g(n)) \Longleftrightarrow g(n) = \Omega(f(n))$

证明

证明:

\begin{align} & f(n) = O(g(n)) \\[4pt] \Longleftrightarrow ~ & \exists c, n_0 > 0 ~ \forall n \ge n_0 : 0 \le f(n) \le c g(n) \\[4pt] \Longleftrightarrow ~ & \exists c, n_0 > 0 ~ \forall n \ge n_0 : 0 \le f(n) / c \le g(n) \\[4pt] \Longleftrightarrow ~ & \exists d = 1 / c, n_0 > 0 ~ \forall n \ge n_0 : 0 \le d f(n) \le g(n) \\[4pt] \Longleftrightarrow ~ & g(n) = \Omega(f(n)) \end{align}

同理可证$f(n) = o(g(n)) \Longleftrightarrow g(n) = \omega(f(n))$

传递性

求证:$\begin{cases} f(n) = O(g(n)) \\ g(n) = O(h(n)) \end{cases} \Longrightarrow f(n) = O(h(n))$

证明

证明:

\begin{align} & \begin{cases} f(n) = O(g(n)) : \exists c_1, n_1 > 0 ~ \forall n \ge n_1 : 0 \le f(n) \le c_1 g(n) \\ g(n) = O(h(n)) : \exists c_2, n_2 > 0 ~ \forall n \ge n_2 : 0 \le g(n) \le c_2 h(n) \end{cases} \\[4pt] \Longrightarrow ~ & \exists c_1, c_2, n_1, n_2 > 0 ~ \forall n \ge \max \{n_1, n_2\} : 0 \le f(n) \le c_1 c_2 h(n) \\[4pt] \Longrightarrow ~ & \exists c = c_1 c_2, n_0 = \max \{n_1, n_2\} > 0 ~ \forall n \ge n_0 : 0 \le f(n) \le c h(n) \\[4pt] \Longrightarrow ~ & f(n) = O(h(n)) \end{align}

同理可证$\begin{cases} f(n) = \Omega(g(n)) \\ g(n) = \Omega(h(n)) \end{cases} \Longrightarrow f(n) = \Omega(h(n))$

传递性

求证:$\begin{cases} f(n) = \Theta(g(n)) \\ g(n) = \Theta(h(n)) \end{cases} \Longrightarrow f(n) = \Theta(h(n))$

证明

证明:

\begin{align} \begin{cases} f(n) = \Theta(g(n)) \Longrightarrow \begin{cases} f(n) = O(g(n)) \\ f(n) = \Omega(g(n)) \end{cases} \\ g(n) = \Theta(h(n)) \Longrightarrow \begin{cases} g(n) = O(h(n)) \\ g(n) = \Omega(h(n)) \end{cases} \end{cases} \end{align}

根据$O$、$\Omega$的传递性有$\begin{cases} f(n) = O(h(n)) \\ f(n) = \Omega(h(n)) \end{cases} \Longrightarrow f(n) = \Theta(h(n))$

传递性

求证:$\begin{cases} f(n) = o(g(n)) \\ g(n) = o(h(n)) \end{cases} \Longrightarrow f(n) = o(h(n))$

证明

证明:

\begin{align} & \begin{cases} f(n) = o(g(n)) : \forall c_1 > 0 ~ \exists n_1 > 0 ~ \forall n \ge n_1 : 0 \le f(n) < c_1 g(n) \\ g(n) = o(h(n)) : \forall c_2 > 0 ~ \exists n_2 > 0 ~ \forall n \ge n_2 : 0 \le g(n) < c_2 h(n) \end{cases} \\[4pt] \Longrightarrow ~ & \forall c_1, c_2 > 0 ~ \exists n_1, n_2 > 0 ~ \forall n \ge \max \{n_1, n_2\} : 0 \le f(n) < c_1 c_2 h(n) \\[4pt] \overset{*}{\Longrightarrow} ~ & \forall c > 0 ~ \exists n_0 = \max \{n_1, n_2\} > 0 ~ \forall n \ge n_0 : 0 \le f(n) < c h(n) \\[4pt] \Longrightarrow ~ & f(n) = o(h(n)) \end{align}

$*$:若$c_1, c_2$的取值范围是$(0, \infty)$,则$c_1 c_2$的取值范围也恰好是$(0, \infty)$

同理可证$\begin{cases} f(n) = \omega(g(n)) \\ g(n) = \omega(h(n)) \end{cases} \Longrightarrow f(n) = \omega(h(n))$

运算法则

求证:$\Theta( \Theta(f(n)) ) = \Theta(f(n))$,类似幂等性

证明

证明:左边的渐进界表示任意,等号表示属于$\in$,即

\begin{align} \forall g(n) = \Theta(f(n)) ~ \forall h(n) = \Theta(g(n)) : h(n) \in \Theta(f(n)) \end{align}

根据$\Theta$的传递性有$h(n) = \Theta(f(n))$,命题得证

运算法则

求证:$\Theta(f(n)) + O(f(n)) = \Theta(f(n))$,$O$可被$\Theta$吸收

证明

证明:左边的渐进界表示任意,等号表示属于$\in$,即

\begin{align} \forall g(n) = \Theta(f(n)) ~ \forall h(n) = O(f(n)) : g(n) + h(n) \in \Theta(f(n)) \end{align}

根据定义

\begin{align} & \exists c_1, c_2, n_g > 0 ~ \forall n \ge n_g : 0 \le c_1 f(n) \le g(n) \le c_2 f(n) \\ & \exists c_3, n_h > 0 ~ \forall n \ge n_h : 0 \le h(n) \le c_3 f(n) \end{align}

对$\forall n \ge \max\{ n_g, n_h \}$有$0 \le c_1 f(n) \le g(n) + h(n) \le (c_2 + c_3) f(n)$

同理可证:$\Theta(f(n)) + o(f(n)) = \Theta(f(n))$,$o$也可被$\Theta$吸收

运算法则

求证:$\Theta(f(n)) + \Theta(g(n)) = \Theta(f(n) + g(n))$,加法合并

证明

证明:左边的渐进界表示任意,等号表示属于$\in$,即

\begin{align} \forall p(n) = \Theta(f(n)) ~ \forall q(n) = \Theta(g(n)) : p(n) + q(n) \in \Theta(f(n) + g(n)) \end{align}

根据定义

\begin{align} & \exists c_1, c_2, n_g > 0 ~ \forall n \ge n_g : 0 \le c_1 f(n) \le p(n) \le c_2 f(n) \\ & \exists c_3, c_4, n_h > 0 ~ \forall n \ge n_h : 0 \le c_3 g(n) \le q(n) \le c_4 g(n) \end{align}

令$c_5 = \min \{c_1, c_3\}$、$c_6 = \max \{c_2, c_4\}$,对$\forall n \ge \max\{ n_g, n_h \}$有

\begin{align} 0 \le c_5 (f(n) + g(n)) \le p(n) + q(n) \le c_6 (f(n) + g(n)) \end{align}

运算法则

求证:$\Theta(f(n)) \cdot \Theta(g(n)) = \Theta(f(n) g(n))$,乘法合并

证明

证明:左边的渐进界表示任意,等号表示属于$\in$,即

\begin{align} \forall p(n) = \Theta(f(n)) ~ \forall q(n) = \Theta(g(n)) : p(n) q(n) \in \Theta(f(n) g(n)) \end{align}

根据定义

\begin{align} & \exists c_1, c_2, n_g > 0 ~ \forall n \ge n_g : 0 \le c_1 f(n) \le p(n) \le c_2 f(n) \\ & \exists c_3, c_4, n_h > 0 ~ \forall n \ge n_h : 0 \le c_3 g(n) \le q(n) \le c_4 g(n) \end{align}

令$c_5 = c_1 c_3$、$c_6 = c_2 c_4$,对$\forall n \ge \max\{ n_g, n_h \}$有

\begin{align} 0 \le c_5 f(n) g(n) \le p(n) q(n) \le c_6 f(n) g(n) \end{align}

保证二歧性的渐进界

实数三歧性:$a > b$、$a = b$、$a < b$恰有一个成立 ✓

函数二歧性:$f(n) = O(g(n))$、$f(n) = \Omega(g(n))$恰有一个成立 ✗

设$f(n) = n$、$g(n) = n^{1 + \sin n}$,注意$\sin n$是周期函数

  • 当$n$在$[\pi/4, 3 \pi/4] \pm 2 \zb \pi$区间内变化时,$f(n) = o(g(n))$
  • 当$n$在$[-3 \pi/4, -\pi/4] \pm 2 \zb \pi$区间内变化时,$f(n) = \omega(g(n))$

为了保证二歧性,保持$O$不变,将$\Omega$改成$\mathop{\Omega}\limits^{\infty}$,不再要求渐进性:

\begin{align} \mathop{\Omega}\limits^{\infty}(g(n)) = \{ f(n) \mid \exists c > 0 : 0 \le c g(n) \le f(n) 对无穷多个整数成立\} \end{align}

忽略正负的渐进界

有的算法教材的渐进上界不要求非负,记其为$O'$,与$O$的关系如下:

\begin{align} f(n) = O'(g(n)) \Longleftrightarrow |f(n)| = O(g(n)) \end{align}

  • 如果$f(n)$本身非负,两个定义没有区别
  • $O$的定义要求$f(n)$渐进非负,其实也是给$f(n)$强制了一个渐进下界
  • $O'$的定义中$f(n)$同样有渐进下界,就是$-c \cdot g(n)$

依然有$f(n) = \Theta(g(n))$等价于$f(n) = O'(g(n))$且$f(n) = \Omega(g(n))$

  • $\Longrightarrow$:显然成立,因为$O(g(n)) \subseteq O'(g(n))$
  • $\Longleftarrow$:$f(n) = O'(g(n))$不要求$f(n)$渐进非负,但$f(n) = \Omega(g(n))$弥补了这个要求,所以此时$O'(g(n))$升级成了$O(g(n))$
忽略对数的渐进界

定义$\widetilde{O}$、$\widetilde{\Omega}$、$\widetilde{\Theta}$如下:

\begin{align} & \widetilde{O}(g(n)) = \{ f(n) \mid \exists c, \class{blue}{k}, n_0 > 0 ~ \forall n \ge n_0 : 0 \le f(n) \le c g(n) \class{blue}{\lg^k n} \} \\ & \widetilde{\Omega}(g(n)) = \{ f(n) \mid \exists c, \class{blue}{k}, n_0 > 0 ~ \forall n \ge n_0 : 0 \le c g(n) \class{blue}{\lg^k n} \le f(n) \} \\ & \widetilde{\Theta}(g(n)) = \{ f(n) \mid \exists c_1, c_2, \class{blue}{k_1, k_2}, n_0 > 0 ~ \forall n \ge n_0 : \\ & \qquad \qquad \qquad \qquad \qquad 0 \le c_1 g(n) \class{blue}{\lg^{k_1} n} \le f(n) \le c_2 g(n) \class{blue}{\lg^{k_2} n} \} \end{align}

例:归并排序的时间复杂度为$\widetilde{\Theta}(n)$

依然有$f(n) = \widetilde{\Theta}(g(n))$等价于$f(n) = \widetilde{O}(g(n))$且$f(n) = \widetilde{\Omega}(g(n))$

\begin{align} & \Longrightarrow: \widetilde{\Theta} : \exists c_1, c_2, k_1, k_2, n_0 > 0 \ldots \Longrightarrow \begin{cases} \widetilde{O} : \exists c_2, k_2, n_0 > 0 \ldots \\ \widetilde{\Omega} : \exists c_1, k_1, n_0 > 0 \ldots \end{cases} \\[-6pt] & \Longleftarrow: \begin{cases} \widetilde{O} : \exists c_2, k_2, n_2 > 0 \ldots \\ \widetilde{\Omega} : \exists c_1, k_1, n_1 > 0 \ldots \end{cases} \Longrightarrow \widetilde{\Theta} : \exists c_1, c_2, k_1, k_2, \max\{ n_1, n_2 \} > 0 \ldots \end{align}

一些例题 判断

$f(n) = O(g(n)) \Longrightarrow g(n) = O(f(n))$是否成立?

判断

不成立,$n = O(n^2)$,但$n^2 \ne O(n)$

一些例题 判断

$2^{n+1} = O(2^n)$是否成立?

判断

成立,因为$0 \le 2^{n+1} \le 2 \cdot 2^n$,取$c=2$、$n_0 = 1$即可

一些例题 判断

$2^{2n} = O(2^n)$是否成立?

判断

不成立,否则存在正常数$c$使得$2^{2n} = 2^n \cdot 2^n \le c \cdot 2^n$渐进成立

由此亦可得出

  • $f(n) = O(f(n/2))$不成立,取$f(n) = 4^n$
  • $f(n) = O(g(n)) \Longrightarrow 2^{f(n)} = O(2^{g(n)})$不成立,取$f(n) = 2n$、$g(n) = n$
一些例题 判断

$f(n) = O((f(n))^2)$是否成立?

判断

若成立,则$\exists c>0$使得$f(n) \le c (f(n))^2$,即$1 \le c f(n)$渐进成立

若$f(n)$有常数渐进下界$l > 0$,取$c = 1/l$即可,否则结论不成立

一些例题 判断

$\min \{ f(n), g(n) \} = \Theta(f(n) + g(n))$是否成立?

判断

不成立,取$f(n) = n$、$g(n) = n^2$,当$n \ge 1$时$\min \{ n ,n^2 \} = n$,但显然$n \ne \Theta(n^2)$

一些例题 证明

求证:$\max \{ f(n), g(n) \} = \Theta(f(n) + g(n))$

证明

证明:易知$(f(n) + g(n)) / 2 \le \max \{ f(n), g(n) \} \le f(n) + g(n)$

取$c_1 = 1/2$、$c_2 = 1$即可

一些例题 证明

求证:$\lceil n \rceil^k = \Theta(n^k)$、$\lfloor n \rfloor^k = \Theta(n^k)$

证明

证明:当$n \ge 2$时有$n/2 \le n - 1 < \lfloor n \rfloor \le n \le \lceil n \rceil < n+1 \le 2n$

  • 若$k \ge 0$,则$n^k / 2^k \le \lceil n \rceil^k, \lfloor n \rfloor^k \le 2^k n^k$
  • 若$k < 0$,则$2^k n^k \le \lceil n \rceil^k, \lfloor n \rfloor^k \le n^k / 2^k$

无论哪种情况,均有$\lceil n \rceil^k = \Theta(n^k)$、$\lfloor n \rfloor^k = \Theta(n^k)$

一些例题 证明

求证:$(n + o(n))^k = \Theta(n^k)$

证明

证明:左边的渐进界表示任意,等号表示属于$\in$,即

\begin{align} \forall f(n) \in o(n) : (n + f(n))^k \in \Theta(n^k) \end{align}

根据定义$\forall c > 0 ~ \exists n_0 > 0 ~\forall n \ge n_0 : 0 \le f(n) < c n$

特别的,取$c = 1/2$,则$0 \le f(n) < n/2 \le n$,$n \le n + f(n) \le 2n$

  • 若$k \ge 0$,则$n^k \le (n + f(n))^k \le 2^k n^k$
  • 若$k < 0$,则$2^k n^k \le (n + f(n))^k \le n^k$

无论哪种情况,均有$(n + f(n))^k = \Theta(n^k)$

一些例题 证明

求证:$\lg ( \Theta(n)) = \Theta(\lg n)$

证明

证明:左边的渐进界表示任意,等号表示属于$\in$,即

\begin{align} \forall f(n) \in \Theta(n) : \lg (f(n)) \in \Theta(\lg n) \end{align}

根据定义$\exists c_1, c_2, n_0 > 0$使得对$\forall n \ge n_0$有$0 \le c_1 n \le f(n) \le c_2 n$,故

\begin{align} \lg c_1 + \lg n \le \lg (f(n)) \le \lg c_2 + \lg n \end{align}

最后只需将上下界再放成$\lg n$的常数倍

  • $\lg c_2 \le \lg n$,这只需$n \ge c_2$
  • $\lg c_1$是常数,$\lg n$上无界,因此只能是$\lg c_1 \ge - \frac{1}{2} \lg n$,这只需$n \ge 1/c_1^2$

综上,对$\forall n \ge \max \{ n_0, 1/c_1^2, c_2 \}$有$\frac{1}{2} \lg n \le \lg (f(n)) \le 2 \lg n$

一些例题 证明

求证:$k \lg k = \Theta(n) \Longrightarrow k = \Theta (n / \lg n)$

证明

证明:$\exists c_1, c_2, k_0 > 0~\forall k \ge k_0: 0 \le c_1 n \le k \lg k \le c_2 n$

如果还有$\lg k$的上下界均是$\lg n$的常数倍,两式相除即得证

取对数$\lg c_1 + \lg n \le \lg k + \lg (\lg k) \le \lg c_2 + \lg n$

  • 上界:若$\lg (\lg k) \ge \lg c_2$则有$\lg k \le \lg n$,这需要$k \ge \exp(c_2)$
  • 下界:若$\lg (\lg k) - \lg c_1 \le \lg k^2 = 2 \lg k$则有$\frac{1}{3} \lg n \le \lg k$,这需要$\lg k \le c_1 k^2$,即$k \le \exp (c_1 k^2)$,注意$\exp (c_1 k^2) \ge 1 + c_1 k^2 > c_1 k^2$,因此有$c_1 k \ge 1$即可

综上,对$\forall k \ge \max \{\exp(c_2), 1/ c_1 \}$有$\frac{1}{3} \lg n \le \lg k \le \lg n$

$\exists c_1, c_2, k_0 > 0 ~ \forall k \ge \max \{k_0, \exp(c_2), 1/ c_1 \}: c_1 \frac{n}{\lg n} \le k \le 3 c_2 \frac{n}{\lg n}$