算法设计与分析


函数的增长

计算机学院    张腾

tengzhang@hust.edu.cn

插入排序 vs. 归并排序

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

CPU 算法 时间复杂度
计算机 A $10^{10}$条指令/秒 插入排序 $2 \cdot n^2$
计算机 B $10^7$条指令/秒 归并排序 $50 \cdot n \lg n$

$$ \begin{align*} \quad & \frac{2 \cdot (10^7)^2 \text{ instructions}}{10^{10} \text{ instructions/s}} = 20000 \text{ s} > 5.5 \text{ h} \\ & \frac{50 \cdot 10^7 \lg 10^7 \text{ instructions}}{10^7 \text{ instructions/s}} \approx 1163 \text{ s} < 20 \text{ m} \end{align*} $$

两点启示:

  1. 只要问题规模$n$足够大,归并排序就能胜过插入排序
  2. 我们应重视算法的渐进效率,即$n \rightarrow \infty$时算法运行时间的增长速度
插入排序 时间分析

insertion_sort(a, n): 时间 次数
for i in range(1, n): $c_1, c'_1$ $i$赋值$1$次、自增$n-1$
$c''_1$ $i$$n$比较$n$
    key = a[i] $c_2$ $key$赋值$n-1$
    j = i - 1 $c_3$ $j$赋值$n-1$
    while j >= 0 and key < a[j]: $c_4,c'_4$ 比较$2 \sum_{i=1}^{n-1} t_i + \{1,2\}$
        a[j+1] = a[j] $c_5$ 赋值$\sum_{i=1}^{n-1} t_i$
        j -= 1 $c_6$ $j$赋值$\sum_{i=1}^{n-1} t_i$
    a[j+1] = key $c_7$ 赋值$n-1$

最坏情况下$T(n) = a n^2 + bn + c$,当$n \rightarrow \infty$

  • 低阶项$bn + c$相对于二次项不重要,二次项的系数$a$也不重要
  • 主宰算法运行时间增长速度的就是$n^2$,因此记$T(n) = \class{blue}{\Theta(n^2)}$
渐进

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

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

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

$a n^2 + bn + c = \class{blue}{\Theta} (n^2)$表示在渐进意义下,即$n$充分大时,二次函数的增长速度和$n^2$一样快,最多差个常数因子

$n$充分大时,二次函数和三次函数、一次函数的增长速度显然不一样快,因此$T(n) \ne \Theta(n^3)$$T(n) \ne \Theta(n)$

渐进

除了表示一样快(相等关系)的$\Theta$外,还有表示不等关系的

  • $O$表示不快于$o$表示严格慢于
  • $\Omega$表示不慢于$\omega$表示严格快于
相等关系 不等关系 严格不等关系
函数 $\Theta$ $O$ $\Omega$ $o$ $\omega$
$=$ $\le$ $\ge$ $<$ $>$

例:对$T(n) = 7 n^3 + 100 n^2 - 20n + 6 = \Theta(n^3)$

  • $T(n) = O(n^k)$其中$k \ge 3$$T(n) = o(n^k)$其中$k > 3$
  • $T(n) = \Omega(n^k)$其中$k \le 3$$T(n) = \omega(n^k)$其中$k < 3$

插入排序的运行时间为$O(n^2)$$\Omega(n)$$o(n^{2.1})$$\omega(n^{0.99})$

本讲内容

引入 5 种限界函数刻画算法的渐进效率

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

限界函数的严格数学定义

限界函数的各种性质和相互关系

渐进上界 渐进下界

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

$$ \begin{align*} \quad 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*} \quad \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))$同理,方便运算
渐进上界 渐进下界

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

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

根据极限定义,存在$n_0$使得对$\forall n \ge n_0$$|q(n) - a_d| \le a_d/2$,即$a_d/2 \le q(n) \le 3 a_d/2$,故当$n \ge \max \{ n_0, 1 \}$$k_1 \le d \le k_2$时有

$$ \begin{align*} \quad 0 \le \frac{a_d}{2} n^{k_1} \le \frac{a_d}{2} n^d \le p(n) \le \frac{3 a_d}{2} n^d \le \frac{3 a_d}{2} n^{k_2} \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$

这也印证了前面的$7 n^3 + 100 n^2 - 20n + 6 = \begin{cases} O(n^k), & k \ge 3 \\ \Omega(n^k), & k \le 3 \end{cases}$

渐进紧确界

渐进紧确界$\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))$

正方向,$\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}$

反方向,$\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, \max\{ n_1, n_2 \} > 0 \ldots$

渐进紧确界

$d$阶多项式$p(n) = \sum_{i=0}^d a_i n^i, ~ (a_d > 0) = \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)$,这不简洁,虽然也是对的
(不)等式中的渐进记号

若渐进记号单独出现在等号右边,如$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)$,先左后右,左边任意,右边存在,右适配左

$\sum_{i=1}^n \Theta (i)$表示$\sum_{i=1}^n (a i + b)$,而不是$\Theta (1) + \Theta (2) + \cdots + \Theta (n)$

表示常量的渐进记号

通常用$n$表示问题输入的规模,我们关心$n \rightarrow \infty$时的情况

若写成$O(g(m))$,则表示的是关心$m \rightarrow \infty$时的$g(m)$的增长速度

如何理解$f(n) = O(1)$

  • 此时$g(n) = n^0 = 1$$f(n)$有个正常数为其渐进上界
  • 通常$O(1)$表示常量时间复杂度,算法执行时间与问题规模$n$无关

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

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

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

非紧确渐进上界

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

$$ \begin{align*} \quad 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)$

非紧确渐进上界

$$ \begin{align*} \quad 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) \} \\[4px] & \Longrightarrow \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 \qquad (*) \end{align*} $$

$f(n) = o(g(n))$表示在渐进意义下$f(n)$相对$g(n)$变得微不足道了

  • 有的书上会采用式($*$)的定义,在$f(n)$渐进非负的前提下两式等价
  • 根据极限定义,对任意$c > 0$存在$n_0$使得对$\forall n \ge n_0$$|\frac{f(n)}{g(n)} - 0| < c$,若$f(n)$渐进非负,则$f(n) < c g(n)$

对数函数 < 多项式函数 < 指数函数:

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

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

$$ \begin{align*} \quad \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] \label{eq: def2} & \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)$

非紧确渐进界

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

易知有$\frac{p(n)}{n^d} = a_d + \frac{a_{d-1}}{n} + \cdots + \frac{a_1}{n^{d-1}} + \frac{a_0}{n^d} \triangleq q(n) \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)$

综上,最高项系数为正的$d$阶多项式$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}$

限界函数的相互关系

等价关系 非严格偏序关系 严格偏序关系
函数 $\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*} \quad 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)) \\ & \big \Updownarrow \\ \qquad \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) \\ & \big \Updownarrow \\ \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 \\ d_1 = 1 / c_2 ~ & \Biggl \Updownarrow ~ d_2 = 1 / c_1 \\ \exists d_1, d_2, n_0 > 0 ~ & \forall n \ge n_0 : 0 \le d_1 f(n) \le g(n) \le d_2 f(n) \\ & \big \Updownarrow \\ 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)) \\ & \big \Updownarrow \\ \qquad \exists c, n_0 > 0 ~ & \forall n \ge n_0 : 0 \le f(n) \le c g(n) \\ & \big \Updownarrow \\ \exists c, n_0 > 0 ~ & \forall n \ge n_0 : 0 \le f(n) / c \le g(n) \\ & \Biggl \Updownarrow ~ d = 1 / c \\ \exists d, n_0 > 0 ~ & \forall n \ge n_0 : 0 \le d f(n) \le g(n) \\ & \big \Updownarrow \\ 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*} & \qquad \qquad \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} \\ & \qquad \qquad \qquad \qquad \qquad \big \Downarrow \\ & \qquad \qquad \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) \\ & \qquad \qquad \qquad \qquad \qquad \Biggl \Downarrow ~ c = c_1 c_2, ~ n_0 = \max \{n_1, n_2\} \\ & \qquad \qquad \exists c, n_0 > 0 ~ \forall n \ge n_0 : 0 \le f(n) \le c h(n) \\ & \qquad \qquad \qquad \qquad \qquad \big \Downarrow \\ & \qquad \qquad \qquad \quad ~ 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*} \qquad \qquad \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*} & \qquad \quad \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} \\ & \qquad \qquad \qquad \qquad \qquad \big \Downarrow \\ & \qquad \qquad \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) \\ & \qquad \qquad \qquad \qquad \qquad \Biggl \Downarrow ~ c = c_1 c_2, ~ n_0 = \max \{n_1, n_2\} \\ & \qquad \qquad \forall c > 0 ~ \exists n_0 > 0 ~ \forall n \ge n_0 : 0 \le f(n) < c h(n) \\ & \qquad \qquad \qquad \qquad \qquad \big \Downarrow \\ & \qquad \qquad \qquad \quad ~ 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))$

运算法则

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

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

$$ \begin{align*} \quad \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*} \quad \forall g(n) = \Theta(f(n)) ~ \forall h(n) = O(f(n)) : g(n) + h(n) \in \Theta(f(n)) \end{align*} $$

根据定义

$$ \begin{align*} \quad & \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*} \quad \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*} \quad & \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*} \quad 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*} \quad \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*} \quad & \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*} \quad 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$周期性地在$[-1,1]$上取值

  • $\sin n = 1$$g(n) = n^2$,不存在常数$c$使得$c g(n)$$f(n)$的渐进下界
  • $\sin n = -1$$g(n) = 1$,不存在常数$c$使得$c g(n)$$f(n)$的渐进上界

为了保证二歧性,保持$O$不变,将$\Omega$改成$\mathop{\Omega}\limits^{\infty}$,其定义如下:

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

注意$\mathop{\Omega}\limits^{\infty}$不再要求渐进性了

忽略正负的渐进符号

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

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

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

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

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

$$ \begin{align*} \quad & \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*} ~ & \Rightarrow: \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} \\ & \Leftarrow: \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)) \rightarrow g(n) = O(f(n))$是否成立?

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

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

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

后者若成立,则存在正常数$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$,即$c f(n) \ge 1$渐进成立

$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 \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*} \quad \forall f(n) = 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*} \quad \forall f(n) = \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$

从而$\lg c_1 + \lg n \le \lg (f(n)) \le \lg c_2 + \lg n$

于是对$\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 c_1 + \lg n \le \lg k + \lg (\lg k) \le \lg c_2 + \lg n$

  • $\forall k \ge \exp(c_2)$,即$\lg k \ge c_2$,有$\lg n \ge \lg k + \lg (\lg k) - \lg c_2 \ge \lg k$
  • $\forall k \ge 1 / c_1$$k \le 1 + k \le 1 + c_1 k^2 \le \exp (c_1 k^2)$,即$\lg k \le c_1 k^2$,于是$\lg n \le \lg k + \lg (\lg k) - \lg c_1 = \lg k + \lg \frac{\lg k}{c_1} \le \lg k + \lg k^2 = 3 \lg k$

故对$\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}$