|
| 1 | +\chapter{算法渐进分析} |
| 2 | + |
| 3 | +\begin{introduction} |
| 4 | + \item 渐进记号 |
| 5 | + \item 渐进增长的性质 |
| 6 | + \item 常见的渐进函数 |
| 7 | +\end{introduction} |
| 8 | + |
| 9 | +\section{关于算法的计算效率} |
| 10 | +当我们在了解计算效率或者研究算法的复杂度时,我们主要集中于运行算法的时间效率 |
| 11 | +--因为我们总是希望能够更快地运行算法。当然对于空间复杂度也是不能够忽略的, |
| 12 | +不过一下我们主要以算法的时间复杂度为载体,介绍算法的渐进分析,空间复杂度的分析 |
| 13 | +可以进行类比。 |
| 14 | + |
| 15 | +一个算法在规模为n的输入下,最坏情况运行时间增长率最多与某个函数$f(n)$成正比, |
| 16 | +函数$f(n)$因此就成为了我们算法运行时间的一个界限,下面将对此进行详细讨论。 |
| 17 | + |
| 18 | +\section{\texorpdfstring{$O,\ \Omega,\ and\ \Theta $}{O, Ω, and θ}} |
| 19 | +在这里,我们希望寻找一种表达算法时间复杂或者是其他函数的方法,在这种方法中,常数系数和低次项 |
| 20 | +对结果是没有影响的。比如 $1.62n^2+3.5n+2.3$ 增长的方式和 $n^2$ 一样。 |
| 21 | + |
| 22 | +\begin{figure}[h] |
| 23 | + \begin{minipage}[t]{1\linewidth} |
| 24 | + \centering |
| 25 | + \includegraphics[width=10cm,height=3.5cm]{image/asymptotic_analysis_1.png} |
| 26 | + \caption{$O,\ \Omega,\ and\ \Theta $} |
| 27 | + \end{minipage} |
| 28 | +\end{figure} |
| 29 | + |
| 30 | +\subsection{渐进上界 $O$} |
| 31 | +令 $f(n)$ 为算法在输入规模为n的情况下的运行时间(最坏情况),给定另一个函数 $g(n)$,当n充分大, |
| 32 | +函数 $f(n)$ 不会超过 $g(n)$ 的常数倍,就有 $f(n)=O(g(n))$。数学定义如下: |
| 33 | + |
| 34 | +\begin{definition}{O ($\cdot$)}{def1} |
| 35 | + \[ |
| 36 | + O(g(n))= \{f(n): \exists\ c,n_0\in R^+,such\ that: \forall n\ge n_0:0\le f(n)\le cg(n)\} |
| 37 | + \] |
| 38 | +\end{definition} |
| 39 | + |
| 40 | + |
| 41 | +举个例子作为说明,假设算法的运行时间有着$f(n)=pn^2+qn+r$的形式,其中p,q,r均为正常数,我们可以说 |
| 42 | +任何具有这种形式的函数都是$O(n^2)$即$pn^2+qn+r=O(n^2)$ ,证明如下: |
| 43 | +\begin{proof} |
| 44 | + \begin{align*} |
| 45 | + \forall n \geq 1,t&hen\ qn\leq qn^2,r\leq rn^2 \\ |
| 46 | + \Longrightarrow f(n)&=pn^2+qn+r \\ |
| 47 | + &\leq pn^2+pn^2+rn^2\\ |
| 48 | + &=(p+q+r)n^2 |
| 49 | + \end{align*} |
| 50 | +\end{proof} |
| 51 | +注意到$O(\cdot)$仅仅代表一个上界,并不代表函数准确的增长率,例如$pn^2+qn+r=O(n^3)$也是成立的 |
| 52 | +但是它不是“最紧”的一个上界。 |
| 53 | +\subsection{渐进下界\ $\Omega$} |
| 54 | +对于算法的渐进下界,我们同样可以对其进行说明:令$f(n)$为算法在输入规模为n的情况下的运行时间,给 |
| 55 | +定另一个函数$g(n)$,如果对充分大的n,函数$f(n)$至少是函数$g(n)$的常数倍,就有$f(n)=\Omega(g(n))$ |
| 56 | +\begin{definition}{$\Omega(\cdot)$}{def2} |
| 57 | +\[ |
| 58 | + \Omega (g(n))= \{f(n): \exists\ c,n_0\in R^+,such\ that: \forall n\ge n_0:0\le cg(n)\le f(n)\} |
| 59 | +\] |
| 60 | +\end{definition} |
| 61 | + |
| 62 | +继续使用 $f(n)=pn^2+qn+r$ 的例子,其中q 、p、 r 均为正常数,我们可以说具有任何这种形式的函数都是$\Omega(n)$。 |
| 63 | +证明如下: |
| 64 | +\begin{proof} |
| 65 | + \begin{align*} |
| 66 | + \forall n \geq 1,t&hen\ qn\leq 0,r\geq 0 \\ |
| 67 | + \Longrightarrow f(n)&=pn^2+qn+r \\ |
| 68 | + &\geq pn^2+pn^2+rn^2\\ |
| 69 | + &=(p+q+r)n^2 |
| 70 | + \end{align*} |
| 71 | +\end{proof} |
| 72 | + |
| 73 | +同$O(\cdot)$的情况,我们注意到$\Omega(\cdot)$仅仅代表一个下界,例如:$f(n)=pn^2+qn+r=\Omega(n)$也是成立的。 |
| 74 | + |
| 75 | +\subsection{渐进紧界$\Theta$} |
| 76 | +在上面知识的支持下,我们发现,对于同一个$f(n)$,其上下界,所对应的$g(n)$可能是相同的,即$f(n)=O(g(n))$并且$f(n)=\Omega(g(n))$ |
| 77 | +,在这种情况下,我们可以说$f(n)=\Theta(g(n))$ |
| 78 | +\begin{definition}{$\Theta(\cdot)$}{def3} |
| 79 | + \[ |
| 80 | + \Theta(g(n)) = \{f(n): \exists\ c_1,c_2,n_0\in R^+,such\ that: \forall n\ge n_0:0\le c_1 g(n)\le f(n)\le c_2 g(n)\} |
| 81 | + \] |
| 82 | +\end{definition} |
| 83 | + |
| 84 | +沿用刚才的例子,对于$f(n)=pn^2+qn+r$,我们可以说任何具有该 |
| 85 | +形式的函数都是$\Theta(n^2)$的,对于其证明就再简单不过了,我们只需要将上面两段合起来即可! |
| 86 | +在实际的计算中,对于显示的函数,我们为了求得$\Theta(\cdot)$,只需保留其最大幂的多项式或者主要成分,去掉常数项即可。 |
| 87 | +\\ |
| 88 | +\\ |
| 89 | +除了刚刚介绍的方法,我们还可以利用以下性质求得$\Theta(\cdot)$: |
| 90 | +\\ |
| 91 | +设$f$和$g$是两个函数,并且 |
| 92 | +\[ |
| 93 | + \lim_{n\rightarrow+\infty}\frac{f(n)}{g(n)} = c \ (c\ge 0) |
| 94 | +\] |
| 95 | +那么$f(n)=\Theta(g(n))$,关于该部分的证明,留给读者自行探索。 |
| 96 | + |
| 97 | + |
| 98 | +\section{渐进增长的一些性质} |
| 99 | +下面将给出渐进增长的一些性质,对于性质的证明,可以自己证明,然后与\cite{textbook1}的P38-P40的证明进行对照 |
| 100 | +\begin{theorem}{Transitivity}{} |
| 101 | + (a)\ If\ $f=O(h)$\ and\ $g=O(h)$, then $f=O(h)$\\ |
| 102 | + (b)\ If\ $f=\Omega(h)$\ and\ $g=\Omega(h)$, then $f=\Omega(h)$\\ |
| 103 | + (c)\ If\ $f=\Theta(h)$\ and\ $g=\Theta(h)$, then $f=\Theta(h)$ |
| 104 | +\end{theorem} |
| 105 | + |
| 106 | +\begin{theorem}{Sum\ of\ Functions}{} |
| 107 | + 假设$f$和$g$是两个函数,若对某个其他的函数$h$,都有:$f=O(h),g=O(h)$\\ |
| 108 | + 那么,$f+g=O(h)$\\ |
| 109 | + 推广开来:令k是确定的常数,$f_1,f_2,f_3,\ldots,f_k$和$h$是函数,且 |
| 110 | + $f_i=O(h)$ \ \ $i\in (1,k)$,\\ |
| 111 | + 那么,$\sum^{k}_{i=1}f_i=O(h)$ |
| 112 | +\end{theorem} |
| 113 | + |
| 114 | +\begin{theorem}{ }{} |
| 115 | + 假设 $f$ 和 $g$ 是两个函数,(取非负值),使得 $g = O(f)$ \\ |
| 116 | + 那么 $f+g=\Theta(f)$ |
| 117 | +\end{theorem} |
| 118 | + |
| 119 | +\section{常见的渐进函数} |
| 120 | +在一般的算法复杂度的分析中,我们常使用$O(\cdot)$进行渐进分析,其中常用的函数有以下几个:\\ |
| 121 | +算数级复杂度: |
| 122 | +\[ |
| 123 | +O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^2logn)<O(n^3)< \cdots |
| 124 | +\] |
| 125 | + |
| 126 | +指数级复杂度: |
| 127 | +\[ |
| 128 | +O(2^n)<O(n!)<O(n^n) |
| 129 | +\] |
| 130 | + |
| 131 | +如要了解更多的标准记号和常用函数,可以参考~\cite{cormen2009introduction} |
0 commit comments