Introduction to Algorithms NoteBook 2
Time:2022-01-25
渐近符号
O {O} O记号
-
定义
-
前提: f ( n ) ≥ 0 f(n){\geq}0 f(n)≥0
-
这里的等号表示归属于某一个集合。这个符号不是对称的,因此不可以逆向推导。
-
举例:
- 当作宏来使用,如 f ( n ) = n 3 + O ( n 2 ) f(n) = n^3+{O}(n^2) f(n)=n3+O(n2),表示存在函数 h ( n ) ∈ O ( n 2 ) h(n){\in}O(n^2) h(n)∈O(n2),使得 f ( n ) = n 3 + h ( n ) f(n) = n^3+h(n) f(n)=n3+h(n).用于重点描述首项是什么,以及加上后面的误差项,关注问题的主要方面。又如: n 2 + O ( n ) = O ( n 2 ) n^2+O(n) = O(n^2) n2+O(n)=O(n2),表示对于任意的 h ( n ) ∈ O ( n ) h(n){\in}{O(n)} h(n)∈O(n),都存在 f ( n ) ∈ O ( n 2 ) f(n){\in}{O(n^2)} f(n)∈O(n2),使得 n 2 + h ( n ) = f ( n ) n^2+h(n) = f(n) n2+h(n)=f(n)。这里很巧妙,要注意观察。
- 可以用于等式关系链,从前向后推导,但是不能反过来推导,因为本身不对称。
- 一般表示一个函数的上界
Ω {\Omega} Ω记号
-
定义
-
定义 Θ {\Theta} Θ
- 其他较为严格定义的符号
o
{o}
o,
ω
{\omega}
ω
-
o {o} o与 O O O的主要区别在于是否对于任意常数c,都存在 n 0 {n_0} n0。严格小于号,没有等于号。
-
ω {\omega} ω记号同上:
Recurrences(递归关系的求解)
代入法
-
猜出解的形式,即是不需要知道确切的系数是多少。
-
验证解的形式是否满足递归方程,即正确性,多采用数学归纳法/代换法。
-
解出常数系数,获得递归方程的解。
举例: T ( n ) = 4 T ( n 2 ) + n T(n) = 4T({\frac{n}{2}})+n T(n)=4T(2n)+n.
-
递归基: T ( 1 ) = O ( 1 ) T(1) = {O(1)} T(1)=O(1)
-
猜测 T ( n ) = O ( n 3 ) T(n)=O(n^3) T(n)=O(n3),即是 T ( k ) ≤ c k 3 T(k){\leq}ck^3 T(k)≤ck3,注意 c c c是待求已确定常数。
注意递归基, T ( 1 ) = O ( 1 ) ≤ c T(1) = O(1){\leq}c T(1)=O(1)≤c。所以常数c可能是一个很大的常数。
-
再次猜测: T ( n ) = O ( n 2 ) T(n)=O(n^2) T(n)=O(n2),即是 T ( k ) ≤ c k 2 f o r k ≤ n T(k){\leq}ck^2{\ }for {\ }k{\leq}n T(k)≤ck2 for k≤n,归纳正确但是无用,进一步加强,考虑 n n n的系数,考虑低阶项。
-
猜测: T ( n ) = c 1 n 2 − c 2 n T(n) = c_1n^2-c_2n T(n)=c1n2−c2n,即是 T ( k ) = c 1 k 2 − c 2 k f o r k ≤ n T(k) = c_1k^2-c_2k{\ }for{\ }k{\leq}{n} T(k)=c1k2−c2k for k≤n,推导出 c 2 ≥ 1 c_2{\geq}1 c2≥1。特别地, c 1 − c 2 ≥ Θ ( 1 ) = T ( 1 ) {c_1-c_2}{\geq}{{\Theta}(1)}=T(1) c1−c2≥Θ(1)=T(1),这里要求 c 1 c_1 c1足够大,这是依据Base Case来得到的。
-
当然,可以采用同样的方法得到 T ( n ) T(n) T(n)下界。
注意:
- 不能采用数学归纳法证明: n = O ( 1 ) n=O(1) n=O(1).否则将由于 n = ( n − 1 ) + 1 = O ( 1 ) + O ( 1 ) = O ( 1 ) n = (n-1)+1=O(1)+O(1)=O(1) n=(n−1)+1=O(1)+O(1)=O(1),而导致出错。因此不可以在数学归纳法的证明中出现 O ( n ) O(n) O(n)记号来表示不确定的常数。
- 本方法需要猜出答案,不适合大面积递归关系的求解。
-
递归树法
举例: T ( n ) = T ( n 4 ) + T ( n 2 ) + n 2 T(n) = T({\frac{n}{4}})+T({\frac{n}{2}})+n^2 T(n)=T(4n)+T(2n)+n2:解 O ( n 2 ) {O(n^2)} O(n2), T ( n ) ≤ 2 n 2 T(n){\leq}{2n^2} T(n)≤2n2.
-
画图为先!
-
对每一行求和!
-
对每一行的和求和。
-
代换法验证,证明之。
-
示例:
主方法(主定理)
- 主定理
注:
-
f ( n ) f(n) f(n)渐进趋向于正数,即是对于 n ≥ n 0 n{\geq}{n_0} n≥n0,都有 f ( n ) > 0 f(n){>}0 f(n)>0.
-
注意比较 f ( n ) f(n) f(n)和 n l o g b a n^{log_ba} nlogba的大小关系,来选择使用哪种情况。
-
特殊情况: T ( n ) = 4 T ( n 2 ) + n 2 lg n T(n) = 4T({\frac{n}{2}})+{\frac{n^2}{\lg{n}}} T(n)=4T(2n)+lgnn2,主方法并不适用。
-
证明主定理
- 递归树法证明,树高 log b n \log_bn logbn,叶节点的数量 a h = a log b n = n log b a a^h=a^{\log_bn}=n^{\log_ba} ah=alogbn=nlogba.
- Case 3 代价逐渐降低,呈现几何级数的形式下降, f ( n ) f(n) f(n)占据主导地位。
- Case 1 每一行之和呈现几何级数增长,所有行之和占据主导地位。即 Θ ( n log b a ) {\Theta}(n^{\log_ba}) Θ(nlogba).
- Case 2 这是 f ( n ) f(n) f(n)与 n log b a n^{\log_ba} nlogba等价,于是 f ( n ) f(n) f(n)与最后递归树的最后一行等价,至于是否含有 log b a \log_ba logba或者 log b k a {\log_b^ka} logbka视情况而定。每一行之和渐进相等,所以大部分分层也渐进相等,所以总代价就是其中一层乘以树高 h h h,即 f ( n ) ∗ h = n log b a log b n = Θ ( n log b a lg n ) f(n)*h=n^{\log_ba}\log_b{n}={\Theta}(n^{\log_ba}\lg{n}) f(n)∗h=nlogbalogbn=Θ(nlogbalgn).
详细证明请参考算法导论第三版 P 56 P56 P56.
Time:2022-01-25