Skip to content

Commit 831b316

Browse files
authored
ch1 算法渐进分析 (#12)
* 加入了ch1 算法渐进分析 * 添加了一个参考文献 * 小改动 * 文件末空行
1 parent 487af7f commit 831b316

5 files changed

Lines changed: 140 additions & 0 deletions

File tree

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ SRC=src
22

33
TEX=\
44
$(SRC)/example.tex\
5+
$(SRC)/Ln1-AsymptoticOrderGrowth.tex\
56
$(SRC)/dynamic-programming-1.tex\
67
$(SRC)/Network-flows.tex\
78
$(SRC)/Ln9-NearestPoints.tex\

book.tex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
% add your code here
3636
% \input{src/example.tex}
37+
\input{src/Ln1-AsymptoticOrderGrowth.tex}
3738
\input{src/Ln9-NearestPoints.tex}
3839
\input{src/Ln11-LargeIntegerMultiplication.tex}
3940
\input{src/dynamic-programming-1.tex}

image/asymptotic_analysis_1.png

65.4 KB
Loading

ref.bib

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,10 @@ @book{cormen2009introduction
44
year={2009},
55
publisher={MIT press}
66
}
7+
8+
@book{textbook1,
9+
title={Algorithms Design},
10+
author={Jon Kleinberg and Éva Tardos},
11+
year={2006},
12+
publisher={Pearson}
13+
}

src/Ln1-AsymptoticOrderGrowth.tex

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
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

Comments
 (0)