14 KiB
算法分析与复杂性理论
1. 函数渐进的界
1.1 大 O 符号
-
定义:
设
f和g是定义域为自然数集N上的函数。若存在正数c和n_0,使得对于一切n > n_0有 $0 \le f (n) \le cg(n)$ 成立,则称f (n)的渐进上界是 $g(n)$,记作:f (n) = O(g(n))自然数:自然数是指用以计量事物的件数或表示事物次序的数。即用数码0,1,2,3,4……所表示的数。自然数由0开始,一个接一个,组成一个无穷的集体。自然数有有序性,无限性。分为偶数和奇数,合数和质数等。
-
说明:
- $f (n) = O(g(n))$,
f (n)的阶不高于g(n)的阶; - 可能存在多个正数
c,只要指出一个即可; - 对前面有限多个值可以不满足不等式;
- 常数函数可以写作
O(1)
- $f (n) = O(g(n))$,
-
栗子: 设 $f (n) = n^2 + n$,则:
- $f (n) = O(n^2)$,取
c = 2, n_0 = 1即可; - $f (n) = O(n^3)$,取
c = 1, n_0 = 2即可;
- $f (n) = O(n^2)$,取
1.2 大 \Omega 符号
-
定义:
设
f和g是定义域为自然数集N上的函数。若存在正数c和n_0,使得对于一切n > n_0有 $0 \le cg(n) \le f (n)$ 成立,则称f (n)的渐进下界是 $g(n)$,记作:f (n) = \Omega(g(n)) -
说明:
- $f (n) = \Omega(g(n))$,
f (n)的阶不低于g(n)的阶; - 可能存在多个正数
c,只要指出一个即可; - 对前面有限多个值可以不满足不等式;
- $f (n) = \Omega(g(n))$,
-
栗子:
设 $f (n) = n^2 + n$,则:
- $f (n) = \Omega(n^2)$,取
c = 1, n_0 = 1即可; - $f (n) = \Omega(100n)$,取
c = \frac{1}{100}, n_0 = 1即可;
- $f (n) = \Omega(n^2)$,取
1.3 小 o 符号
-
定义:
设
f和g是定义域为自然数集N上的函数。若对于任意正数c都存在 $n_0$,使得对于一切n > n_0有 $0 \le f (n) \le cg(n)$ 成立,则记作:f (n) = o(g(n)) -
说明:
- $f (n) = o(g(n))$,
f (n)的阶低于g(n)的阶; - 对不同的正数 $c$,
n_0不一样,c越小n_0越大; - 对前面有限多个值可以不满足不等式;
- $f (n) = o(g(n))$,
-
栗子:
设 $f (n) = n^2 + n$,则:
f (n) = o(n^3)证:
-
当
c \ge 1时显然成立,只要取 $n_0 = 2$,$n^2 + n < cn^3$; -
当
0 < c < 1时,取n_0 = \left \lceil \frac{2}{c} \right \rceil即可,因为当 $n \ge n_0$:cn \ge cn_0 > 2n^2 + n < 2n^2 < cn^3
-
1.4 小 \omega 符号
-
定义:
设
f和g是定义域为自然数集N上的函数。若对于任意正数c都存在 $n_0$,使得对于一切n > n_0有 $0 \le cg(n) \le f (n) $ 成立,则记作:f (n) = \omega(g(n)) -
说明:
- $f (n) = o(g(n))$,
f (n)的阶高于g(n)的阶; - 对不同的正数 $c$,
n_0不一样,c越小n_0越大; - 对前面有限多个值可以不满足不等式;
- $f (n) = o(g(n))$,
1.5 \Theta 符号
-
定义:
若
f (n) = O(g(n))且 $f (n) = \Omega(g(n))$,则记作:f (n) = \Theta(g(n)) -
说明:
f (n)的阶与g(n)的阶相同- 对前面有限多个值可以不满足条件;
| 定义 | 说明 | |
|---|---|---|
O |
设 f 和 g 是定义域为自然数集N上的函数。若存在正数 c 和 n_0 ,使得对于一切 n > n_0 有 $0 \le f (n) \le cg(n)$ 成立,则称 f (n) 的渐进上界是 $g(n)$,记作:f (n) = O(g(n)) |
$f (n) = O(g(n))$,f (n) 的阶不高于 g(n) 的阶; 可能存在多个正数 c ,只要指出一个即可; 对前面有限多个值可以不满足不等式; 常数函数可以写作 O(1) |
\Omega |
设 f 和 g 是定义域为自然数集N上的函数。若存在正数 c 和 n_0 ,使得对于一切 n > n_0 有 $0 \le cg(n) \le f (n)$ 成立,则称 f (n) 的渐进下界是 $g(n)$,记作:f (n) = \Omega(g(n)) |
$f (n) = \Omega(g(n))$,f (n) 的阶不低于 g(n) 的阶; 可能存在多个正数 c ,只要指出一个即可; 对前面有限多个值可以不满足不等式; |
o |
设 f 和 g 是定义域为自然数集N上的函数。若对于任意正数 c 都存在 $n_0$,使得对于一切 n > n_0 有 $0 \le f (n) \le cg(n)$ 成立,则记作:f (n) = o(g(n)) |
$f (n) = o(g(n))$,f (n) 的阶低于 g(n) 的阶; 对不同的正数 $c$,n_0 不一样,c 越小 n_0 越大; 对前面有限多个值可以不满足不等式; |
\omega |
设 f 和 g 是定义域为自然数集N上的函数。若对于任意正数 c 都存在 $n_0$,使得对于一切 n > n_0 有 $0 \le cg(n) \le f (n) $ 成立,则记作:f (n) = \omega(g(n)) |
$f (n) = o(g(n))$,f (n) 的阶高于 g(n) 的阶; 对不同的正数 $c$,n_0 不一样,c 越小 n_0 越大; 对前面有限多个值可以不满足不等式; |
\Theta |
若 f (n) = O(g(n)) 且 $f (n) = \Omega(g(n))$,则记作:f (n) = \Theta(g(n)) |
f (n) 的阶与 g(n) 的阶相同 对前面有限多个值可以不满足条件; |
2. 函数渐进界的定理
2.1 定理1:Knowledge
-
定理内容:
设
f和g是定义域为自然数集合的函数。-
如果
\lim_{n \to \infty}\frac{f (n)}{g(n)}存在,并且等于某个常数c > 0,那么:f (n) = \Theta(g(n)) -
如果
\lim_{n \to \infty}\frac{f (n)}{g(n)} = 0,那么:f (n) = o(g(n)) -
如果
\lim_{n \to \infty}\frac{f (n)}{g(n)} = +\infty,那么:f (n) = \omega(g(n))
-
-
栗子:
设 $f (n) = \frac{1}{2}n^2 - 3n$,证明
f (n) = \Theta(n^2)证:因为
\lim_{n \to \infty}\frac{f (n)}{n^2} = \lim_{n \to \infty}\frac{\frac{1}{2}n^2 - 3n}{n^2} = \frac{1}{2}根据定理1,有
f (n) = \Theta(n^2) -
根据定理1,得到的一些重要的结论:
n^d = o(r^n), r > 1, d > 0=> 多项式函数的阶低于指数函数的阶\ln n = o(n^d), d > 0=> 对数函数的阶低于幂函数的阶
2.2 定理2:
-
定理内容:
设
f, g, h的定义域为自然数集合:(函数阶之间的关系具有可传递性)- 如果 $f = O(g)$,且 $f = O(h)$,那么 $f = O(h)$;
- 如果 $f = \Omega(g)$,且 $f = \Omega(h)$,那么 $f = \Omega(h)$;
- 如果 $f = \Theta(g)$,且 $f = \Theta(h)$,那么 $f = \Theta(h)$;
2.3 定理3:
-
定理内容:
设
f和g是定义域为自然数集合的函数,若对某个其它的函数h,有f = O(h)和 $g = O(h)$,那么:f + g = O(h)=> 该性质可以推广到有限个函数
-
算法的时间复杂度是各步操作时间之和,在常数步的情况下取最高阶的函数即可。
4. 基本函数
4.1 对数函数
- 符号:
\log n = \log_2 n\log^k n = (\log n)^k\log\log n = \log(\log n)
- 性质:
\log_2 n = \Theta(\log_l n)log_b n = o(n^\alpha), \alpha > 0\alpha ^{\log_b n} = n^{\log_b \alpha}
4.2 指数函数与阶乘
-
斯特林公式(Stirling):
n! = \sqrt{2\pi n}(\frac{n}{e})^n(1 + \Theta(\frac{1}{n})) -
由 Stirling 公式得到的结论:
n! = o(n^n)n! = \omega(2^n)\log(n!) = \Theta(n\log n)
-
\log(n!) = \Theta(n\log n)证明:Knowledge
4.3 取整函数
- 定义:
\left \lfloor x \right \rfloor:表示小于等于x的最大整数\left \lceil x \right \rceil:表示大于等于x的最大整数
- 性质:
x - 1 < \left \lfloor x \right \rfloor \le x \le \left \lceil x \right \rceil < x + 1\left \lfloor x + n \right \rfloor = \left \lfloor x \right \rfloor + n, \left \lceil x + n \right \rceil = \left \lceil x \right \rceil + n\left \lceil \frac{n}{2} \right \rceil + \left \lfloor \frac{n}{2} \right \rfloor = n\left \lceil \frac{\left \lceil \frac{n}{a} \right \rceil}{b} \right \rceil = \left \lceil \frac{n}{ab} \right \rceil, \left \lfloor \frac{\left \lfloor \frac{n}{a} \right \rfloor}{b} \right \rfloor = \left \lfloor \frac{n}{ab} \right \rfloor
4.4 按照阶排序 Knowledge
2^{2^n}, n!, n2^n, (\frac{3}{2})^n, (\log n)^{\log n} = n^{\log\log n}
n^3, \log{(n!)} = \Theta(n\log n), n = 2^{\log n}
\log^2n, \log n, \sqrt{\log n}, \log\log n
n^{\frac{1}{\log n}} = 1
5. 序列求和的方法
5.1 引例
\begin{aligned}(1). \sum_{k = 1}^{n - 1}\frac{1}{k(k + 1)}&=\sum_{k = 1}^{n - 1}(\frac{1}{k} - \frac{1}{k + 1})\\ &=\sum_{k = 1}^{n - 1}\frac{1}{k} - \sum_{k = 1}^{n - 1}\frac{1}{k + 1}\\ &=\sum_{k = 1}^{n - 1}\frac{1}{k} - \sum_{k = 2}^{n}\frac{1}{k} \\ &= 1 - \frac{1}{n} \\ \end{aligned}
\begin{aligned}(2). \sum_{t = 1}^{k}t2^{t - 1}&=\sum_{t = 1}^{k}t(2^t - 2^{t - 1}) \\ &=\sum_{t = 1}^{k}t2^t - \sum_{t = 1}^{k}t2^{t - 1} \\ &=\sum_{t = 1}^{k}t2^t - \sum_{t = 0}^{k - 1}(t + 1)2^t \\ &=\sum_{t = 1}^{k}t2^t - \sum_{t = 0}^{k - 1}t2^t - \sum_{t = 0}^{k - 1}2^t \\ &=k2^t - (2^k - 1) = (k - 1)2^k + 1\\ \end{aligned}
5.2 二分检索的平均时间复杂度 knowledge
A(n) = \left \lfloor \log n \right \rfloor + \frac{1}{2}
5.3 估计和式上界的放大法 knowledge
-
两个放大公式:
-
\sum_{k = 1}^n a_k \le na_{max} -
假设存在常数
r < 1,使得对一切k \ge 0有\frac{a_{k + 1}}{a_k} \le r成立,则有如下结论:\sum_{k = 0}^n \le \sum_{k = 0}^\infty a_0r^k = a_0\sum_{k = 0}^\infty r^k = \frac{a_0}{1 - r}
-
-
栗子:
估计
\sum_{k = 1}^n \frac{k}{3^k}的上界。解:
\sum_{k = 1}^n \frac{k}{3^k} = \sum_{k = 0}^{n}\frac{k}{3^{k}} 令 $a_k = \frac{k}{3^{k}}, a_{k + 1} = \frac{k + 1}{3^{k + 1}}$,则
\frac{a_{k + 1}}{a_k} = \frac{(k + 1)3^{k}}{(k)3^{k + 1}} = \frac{k + 1}{3k} \le \frac{2}{3} (k >= 1)所以,由上述第二个放大公式有:
\sum_{k = 1}^n \frac{k}{3^k} \le \sum_{k = 1}^\infty \frac{1}{3}(\frac{2}{3})^{k - 1} = \frac{1}{3}\frac{1}{1 - \frac{2}{3}} = 1
5.4 估计和式渐进的界 Knowledge
估计\sum_{k = 1}^n \frac{1}{k} 的渐进的界
-
\sum_{k = 1}^n \frac{1}{k} \ge \int_1^{n + 1}\frac{dx}{x} = \ln (n + 1) -
\sum_{k = 1}^n \frac{1}{k} = \frac{1}{1} + \sum_{k = 2}^n \frac{1}{k} \le 1 + \int_1^{n}\frac{dx}{x} = \ln n + 1所以,
\sum_{k = 1}^n \frac{1}{k} = \Theta(\ln n) = \Theta(\log n)
6. 递推方程与算法分析 Knowledge
-
主定理的应用背景:
T(n) = aT(\frac{n}{b}) + f (n)a:规约后的子问题个数\frac{n}{b}:规约后子问题的规模f (n):规约过程以及组合子问题的解的工作量
二分检索 =>
T(n) = T(\frac{n}{2}) + 1二分归并排序 =>
T(n) = 2T(\frac{n}{2}) + n - 1 -
主定理:
设
a > 1, b > 1为常数,f (n)为函数,T(n)为非负整数,且 $T(n) = aT(\frac{n}{b}) + f (n)$,则:-
若 $f (n) = O(n^{log_b a - \epsilon})$,
\epsilon > 0,那么:T(n) = \Theta(n^{\log_b a}) -
若 $f (n) = \Theta(n^{log_b a})$,那么:
T(n) = \Theta(n^{\log_b a}\log n) -
若 $f (n) = \Omega(n^{\log_b a + \epsilon})$,$\epsilon > 0$,且对于某个常数
c < 1和充分大的n有 $af(\frac{n}{b}) \le cf (n)$,那么:T(n) = \Theta(f (n))
-
-
例1:
求解递推方程:
T(n) = 9T(\frac{n}{3}) + n解:
a = 9, b = 3, f (n) = n $n^{\log_b a} = n^{log_3 9} = n^2$,
f (n) = O(n^{log_3 9 - 1}) 根据主定理规则1,其中 $\epsilon = 1$:
T(n) = \Theta(n^2) -
例2:
求解递推方程:
T(n) = T(\frac{2n}{3}) + 1解:
a = 1, b = \frac{3}{2}, f (n) = 1
n^{log_b a} = n^{log_{\frac{3}{2}} 1} = 1,f (n) = n^{log_{\frac{3}{2}}1} 根据主定理规则2:
T(n) = \Theta(n^{\log_{\frac{3}{2}} 1} \log n) = \Theta(\log n) -
例3:
求解递推方程:
T(n) = 3T(\frac{n}{4}) + n\log n解:
a = 3, b = 4, f (n) = n\log n
n^{\log_b a} = n^{\log_4 3} \approx 0.793 取 $\epsilon = 0.2$,则
f (n) = n\log n = \Omega(n^{\log_4 3 + 0.2})=\Omega(n^{0.993}) 条件验证:要使
af(\frac{n}{b}) \le cf (n)成立,带入f (n) = n\log n得到:
3(\frac{n}{4})\log (\frac{n}{4}) \le cn\log n 当
c \ge \frac{3}{4}时,上述不等式可以对充分打的n成立,根据主定理规则3:
T(n) = \Theta(f (n)) = \Theta(n\log n) -
二分检索:
W(n) = W(\frac{n}{2}) + 1, W(1) = 1解:
a = 1, b = 2, f (n) = 1, n^{\log_2 1} = 1 根据主定理规则2:
W(n) = \Theta(\log n) -
二分归并排序:
W(n) = 2W(\frac{n}{2}) + n - 1, W(1) = 0解:
a = 2, b = 2, f (n) = n - 1, n^{\log_2 2} = n 根据主定理规则2:
W(n) = \Theta(n\log n) -
例4: => 不能使用主定理的情形
求解递推方程:
T(n) = 2T(\frac{n}{2}) + n\log n解:
a = 2, b = 2, f (n) = n\log n, n^{\log_b a} = n 不存在
\epsilon > 0使得:n\log n = \Omega(n^{1 + \epsilon}) 不存在
c < 1使af(\frac{n}{b}) \le cf (n)对所有充分大的n成立
2(\frac{n}{2})\log{\frac{n}{2}} = n(\log n - 1) \le cn\log n




