算法复习——分而治之篇之递归式求解

算法复习——分而治之篇之递归式求解

以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!

1. 递归树法

T ( n ) = { T ( n 4 ) + T ( 3 n 4 ) + n i f   n ≥ 4 1 i f   n < 4 T(n)=\left\{ \begin{array}{rcl} T(\frac{n}{4})+T(\frac{3n}{4})+n & & {if\ n \geq 4}\\ 1 & & {if\ n < 4} \end{array} \right. T(n)={ T(4n)+T(43n)+n1if n4if n<4

​ 递归树如下所示。

在这里插入图片描述

​ 从图中,容易发现左分支是以4的速度进行衰减,右分支则是 4 3 \frac{4}{3} 34的速度进行衰减,所以最后一层的叶子节点数一定小于等于 n n n。分析树的深度依然采用最差分析的方法,树的深度由衰减速度慢的那一支的深度决定,所以
T ( n ) = O ( n l o g 4 3 n ) = O ( n l o g 2 n l o g 2 4 3 ) = O ( n l o g n ) . T(n)=O(nlog_{\frac{4}{3}}n)=O(n\frac{log_{2}n}{log_{2}\frac{4}{3}})=O(nlogn). T(n)=O(nlog34n)=O(nlog234log2n)=O(nlogn).
​ 但是稍微一想,就会引出一个问题:大O是渐近上界,所以没问题的;那么,这是不是大 Θ \Theta Θ呢?是不是渐近紧确界?

​ 递归树法似乎不行了,因为它无法精确度量最下面一层叶子节点的规模。

2. 代入法

代入法可以简单理解为基于猜测并代入的数学归纳法证明,这里就不赘述了。

3. 主定理法

给出形如 T ( n ) = a T ( n b ) + f ( n ) T(n)=aT(\frac{n}{b})+f(n) T(n)=aT(bn)+f(n)的递归式的通解,其中常数 a ≥ 1 a \geq 1 a1 b > 1 b > 1 b>1

​ 可以先画递归树,直观理解一下。

在这里插入图片描述

​ 其中,最底层叶节点的代价之和需采用对数技巧 a l o g b n = n l o g b a a^{log_{b}n}=n^{log_{b}a} alogbn=nlogba

​ 因此,我们可以得到关于 T ( n ) T(n) T(n)的求和式:
T ( n ) = Θ ( n l o g b a ) + ∑ i = 0 l o g b ( n − 1 ) a i f ( n b i ) T(n)=\Theta(n^{log_{b}a})+\sum_{i=0}^{log_{b}(n-1)}a^{i}f(\frac{n}{b^{i}}) T(n)=Θ(nlogba)+i=0logb(n1)aif(bin)
​ 根据主定理,对形如 T ( n ) = a T ( n b ) + f ( n ) T(n)=aT(\frac{n}{b})+f(n) T(n)=aT(bn)+f(n)的递归式,可得
T ( n ) = { Θ ( f ( n ) ) i f   f ( n ) = Ω ( n l o g b a + ϵ ) Θ ( n l o g b a l o g n ) i f   f ( n ) = Θ ( n l o g b a ) Θ ( n l o g b a ) i f   f ( n ) = O ( n l o g b a − ϵ ) T(n)=\left\{ \begin{array}{rcl} \Theta(f(n)) & & {if\ f(n)=\Omega(n^{log_{b}a+\epsilon})}\\ \Theta(n^{log_{b}a}logn) & & {if\ f(n)=\Theta(n^{log_{b}a})}\\ \Theta(n^{log_{b}a}) & & {if\ f(n)=O(n^{log_{b}a-\epsilon})} \end{array} \right. T(n)=Θ(f(n))Θ(nlogbalogn)Θ(nlogba)if f(n)=Ω(nlogba+ϵ)if f(n)=Θ(nlogba)if f(n)=O(nlogbaϵ)
​ 由上式可见,我们本质上是在比较根节点代价 f ( n ) f(n) f(n)与叶节点代价之和 n l o g b a n^{log_{b}a} nlogba,具体解释见下。

​ 第一种情况:若存在常数 ϵ > 0 \epsilon > 0 ϵ>0使 f ( n ) = Ω ( n l o g b a + ϵ ) f(n)=\Omega(n^{log_{b}a+\epsilon}) f(n)=Ω(nlogba+ϵ),且存在常数 c < 1 c < 1 c<1和足够大的 n n n使得 a f ( n b ) ≤ c f ( n ) af(\frac{n}{b}) \leq cf(n) af(bn)cf(n),则 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))。在该情况中,第一个条件的含义是 f ( n ) f(n) f(n)多项式意义大于 n l o g b a n^{log_{b}a} nlogba(不止渐近大于且相差因子 n ϵ n^{\epsilon} nϵ),即 Θ ( n l o g b a ) \Theta(n^{log_{b}a}) Θ(nlogba) T ( n ) T(n) T(n)的求和式中可以省去;第二个条件是“正则条件”,保证了根节点大于下一层代价之和,也就说 T ( n ) T(n) T(n)求和式中的 ∑ \sum 求和的级数是收敛的(若级数收敛,则 ∑ i = 0 l o g b ( n − 1 ) a i f ( n b i ) < 1 1 − c f ( n ) \sum_{i=0}^{log_{b}(n-1)}a^{i}f(\frac{n}{b^{i}})<\frac{1}{1-c}f(n) i=0logb(n1)aif(bin)<1c1f(n))。总的来说,就是根节点占了整个计算成本的主成本。

​ 第二种情况比较好理解,若 f ( n ) = Θ ( n l o g b a ) f(n)=\Theta(n^{log_{b}a}) f(n)=Θ(nlogba),从递归树中也很容易看出 T ( n ) = Θ ( n l o g b a l o g n ) T(n)=\Theta(n^{log_{b}a}logn) T(n)=Θ(nlogbalogn)

​ 第三种情况:若存在常数 ϵ > 0 \epsilon > 0 ϵ>0使 f ( n ) = O ( n l o g b a − ϵ ) f(n)=O(n^{log_{b}a-\epsilon}) f(n)=O(nlogbaϵ),则 T ( n ) = Θ ( n l o g b a ) T(n)=\Theta(n^{log_{b}a}) T(n)=Θ(nlogba)。这个也比较好理解,对于求和式中的每一项都多项式意义上小于 n l o g b a n^{log_{b}a} nlogba,所以即使是将求和式放大到用其中的最大项去乘 l o g   n log\ n log n,这个求和式的值也在多项式意义上小于 n l o g b a n^{log_{b}a} nlogba

​ 虽然做了如上解释,但是这个式子可能依然比较复杂,难以理解;所以大家在使用中,通常采用主定理的简化形式,即当 f ( n ) f(n) f(n)形式为 n k n^{k} nk时,可以规避多项式意义上的大于。

​ 根据主定理的简化形式,对形如 T ( n ) = a T ( n b ) + n k T(n)=aT(\frac{n}{b})+n^{k} T(n)=aT(bn)+nk的递归式,可得
T ( n ) = { Θ ( n k ) i f   k > l o g b a Θ ( n k l o g n ) i f   k = l o g b a Θ ( n l o g b a ) i f   k < l o g b a T(n)=\left\{ \begin{array}{rcl} \Theta(n^{k}) & & {if\ k>log_{b}a}\\ \Theta(n^{k}logn) & & {if\ k=log_{b}a}\\ \Theta(n^{log_{b}a}) & & {if\ k<log_{b}a} \end{array} \right. T(n)=Θ(nk)Θ(nklogn)Θ(nlogba)if k>logbaif k=logbaif k<logba

​ 此外,还有主定理的扩展形式:
T ( n ) = { Θ ( f ( n ) ) i f   f ( n ) = Ω ( n l o g b a + ϵ ) Θ ( n l o g b a l o g k + 1 n ) i f   f ( n ) = Θ ( n l o g b a l o g k n ) , k ≥ 0 Θ ( n l o g b a ) i f   f ( n ) = O ( n l o g b a − ϵ ) T(n)=\left\{ \begin{array}{rcl} \Theta(f(n)) & & {if\ f(n)=\Omega(n^{log_{b}a+\epsilon})}\\ \Theta(n^{log_{b}a}log^{k+1}n) & & {if\ f(n)=\Theta(n^{log_{b}a}log^kn),k \geq 0}\\ \Theta(n^{log_{b}a}) & & {if\ f(n)=O(n^{log_{b}a-\epsilon})} \end{array} \right. T(n)=Θ(f(n))Θ(nlogbalogk+1n)Θ(nlogba)if f(n)=Ω(nlogba+ϵ)if f(n)=Θ(nlogbalogkn),k0if f(n)=O(nlogbaϵ)

猜你喜欢

转载自blog.csdn.net/NickHan_cs/article/details/111599820