11\chapter {算法渐进分析 }
22
33\begin {introduction }
4- \item 渐进记号
5- \item 渐进增长的性质
6- \item 常见的渐进函数
4+ \item 渐进记号
5+ \item 渐进增长的性质
6+ \item 常见的渐进函数
77\end {introduction }
88
99\section {关于算法的计算效率 }
1010当我们在了解计算效率或者研究算法的复杂度时,我们主要集中于运行算法的时间效率
1111--因为我们总是希望能够更快地运行算法。当然对于空间复杂度也是不能够忽略的,
1212不过一下我们主要以算法的时间复杂度为载体,介绍算法的渐进分析,空间复杂度的分析
1313可以进行类比。
14-
14+
1515一个算法在规模为n的输入下,最坏情况运行时间增长率最多与某个函数$ f(n)$ 成正比,
1616函数$ f(n)$ 因此就成为了我们算法运行时间的一个界限,下面将对此进行详细讨论。
17-
17+
1818\section {\texorpdfstring {$ O,\ \Omega ,\ and\ \Theta $ }{O, Ω, and θ} }
1919在这里,我们希望寻找一种表达算法时间复杂或者是其他函数的方法,在这种方法中,常数系数和低次项
2020对结果是没有影响的。比如 $ 1.62 n^2 +3.5 n+2.3 $ 增长的方式和 $ n^2 $ 一样。
2121
2222\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 }
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 }
2828\end {figure }
29-
29+
3030\subsection {渐进上界 $ O$ }
31- 令 $ f(n)$ 为算法在输入规模为n的情况下的运行时间(最坏情况),给定另一个函数 $ g(n)$ ,当n充分大,
31+ 令 $ f(n)$ 为算法在输入规模为n的情况下的运行时间 (最坏情况),给定另一个函数 $ g(n)$ ,当n充分大,
3232函数 $ f(n)$ 不会超过 $ g(n)$ 的常数倍,就有 $ f(n)=O(g(n))$ 。数学定义如下:
3333
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- \]
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+ \]
3838\end {definition }
39-
39+
4040
4141举个例子作为说明,假设算法的运行时间有着$ f(n)=pn^2 +qn+r$ 的形式,其中p,q,r均为正常数,我们可以说
4242任何具有这种形式的函数都是$ O(n^2 )$ 即$ pn^2 +qn+r=O(n^2 )$ ,证明如下:
4343\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* }
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* }
5050\end {proof }
5151注意到$ O(\cdot )$ 仅仅代表一个上界,并不代表函数准确的增长率,例如$ pn^2 +qn+r=O(n^3 )$ 也是成立的
5252但是它不是“最紧”的一个上界。
5353\subsection {渐进下界\ $ \Omega $ }
5454对于算法的渐进下界,我们同样可以对其进行说明:令$ f(n)$ 为算法在输入规模为n的情况下的运行时间,给
5555定另一个函数$ g(n)$ ,如果对充分大的n,函数$ f(n)$ 至少是函数$ g(n)$ 的常数倍,就有$ f(n)=\Omega (g(n))$
5656\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- \]
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+ \]
6060\end {definition }
6161
6262继续使用 $ f(n)=pn^2 +qn+r$ 的例子,其中q 、p、 r 均为正常数,我们可以说具有任何这种形式的函数都是$ \Omega (n)$ 。
6363证明如下:
6464\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* }
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* }
7171\end {proof }
7272
7373同$ O(\cdot )$ 的情况,我们注意到$ \Omega (\cdot )$ 仅仅代表一个下界,例如:$ f(n)=pn^2 +qn+r=\Omega (n)$ 也是成立的。
@@ -76,9 +76,9 @@ \subsection{渐进紧界$\Theta$}
7676在上面知识的支持下,我们发现,对于同一个$ f(n)$ ,其上下界,所对应的$ g(n)$ 可能是相同的,即$ f(n)=O(g(n))$ 并且$ f(n)=\Omega (g(n))$
7777,在这种情况下,我们可以说$ f(n)=\Theta (g(n))$
7878\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- \]
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+ \]
8282\end {definition }
8383
8484沿用刚才的例子,对于$ f(n)=pn^2 +qn+r$ ,我们可以说任何具有该
@@ -90,42 +90,42 @@ \subsection{渐进紧界$\Theta$}
9090\\
9191设$ f$ 和$ g$ 是两个函数,并且
9292\[
93- \lim _{n\rightarrow +\infty }\frac {f(n)}{g(n)} = c \ (c\ge 0)
93+ \lim _{n\rightarrow +\infty }\frac {f(n)}{g(n)} = c \ (c\ge 0)
9494\]
9595那么$ f(n)=\Theta (g(n))$ ,关于该部分的证明,留给读者自行探索。
9696
9797
9898\section {渐进增长的一些性质 }
9999下面将给出渐进增长的一些性质,对于性质的证明,可以自己证明,然后与\cite {textbook1 }的P38-P40的证明进行对照
100100\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)$
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)$
104104\end {theorem }
105105
106106\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)$
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)$
112112\end {theorem }
113113
114- \begin {theorem }{ }{}
115- 假设 $ f$ 和 $ g$ 是两个函数,(取非负值),使得 $ g = O(f)$ \\
116- 那么 $ f+g=\Theta (f)$
114+ \begin {theorem }{}{}
115+ 假设 $ f$ 和 $ g$ 是两个函数, (取非负值),使得 $ g = O(f)$ \\
116+ 那么 $ f+g=\Theta (f)$
117117\end {theorem }
118118
119119\section {常见的渐进函数 }
120120在一般的算法复杂度的分析中,我们常使用$ O(\cdot )$ 进行渐进分析,其中常用的函数有以下几个:\\
121121算数级复杂度:
122122\[
123- O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^2logn)<O(n^3)< \cdots
123+ O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^2logn)<O(n^3)< \cdots
124124\]
125125
126126指数级复杂度:
127127\[
128- O(2^n)<O(n!)<O(n^n)
128+ O(2^n)<O(n!)<O(n^n)
129129\]
130130
131131如要了解更多的标准记号和常用函数,可以参考~\cite {cormen2009introduction }
0 commit comments