Master Method
- 分治递归,是我们常用的程序设计思想,如何衡量一个递归算法设计的好坏呢?
- 这就使得我们得去思考:递归算法的复杂度如何计算
Master Method 是这样描述的:
递归树
-
第一层:\(1\) 个
-
第二层:\(k\) 个
-
第三层:\(k^2\) 个
-
第 \(i+1\) 层:\(k^i\)个
考虑叶子节点 \(f(n/m^i)=1\Longrightarrow n=m^i\iff i=\log_m{n}\)
推导过程
中括号内,为等比数列求和,公比 \(q\) 分类讨论
考虑 \(i\rightarrow+\infty\)
-
when $ q=1,\ S=i+1=i$
-
when \(q<1,\ S=\frac{1}{1-q}\)
-
when \(q>1,\ S=q^i\)
$ \therefore T(n)=n^d\cdot S$ 分三类讨论:
- \(q=1\iff k=m^d\qquad T(n)=n^d\cdot i=n^d\cdot \log_m{n}=O(n^d\cdot \log_m{n})\)
- \(q<1\iff k<m^d\qquad T(n)=n^d\cdot \frac{1}{1-q}=C\cdot n^d=O(n^d)\)
- \(q>1\iff k>m^d\qquad T(n)=n^d\cdot q^i=n^d\cdot (\frac{k}{m^d})^{(\log_m{n})}=O(n^{\log_m{k}})\qquad (*)\)
\((*)\) 推导:
\(n^d\cdot (\frac{k}{m^d})^{(\log_{\text{m}}{n})}\)
\(=n^d\cdot \frac{k^{\log_{\ \text{ m}}{n}}}{(m^d)^{\log_{\ \text{ m}}{n}}}\)
\(=n^d\cdot \frac{k^{\log_{\ \text{ m}}{n}}}{(m^{\log_{\ \text{ m}}{n}})^d}\)
\(=n^d\cdot \frac{k^{\log_{\ \text{ m}}{n}}}{n^d}\)
\(=k^{\log_{\ \text{m}}{n}}\)
\(=k^{\frac{\log_{\ \text{ k}}{n}}{\log_{\ \text{ k}}{m}}}\)
\(=(k^{\log_{k}{n}})^\frac{1}{log_{\ k}{\ m}}\)
\(=n^{\log_{m}{k}}\)
练习题
master method
$ 1.\quad T(n)=T(n/3)+n$
$ 2.\quad T(n)=T(2n/3)+1$
$ 3.\quad T(n)=4T(n/2)+n$
$ 4.\quad T(n)=2T(n/2)+n$