算法导论4-5
读书笔记
使用主方法,往往能够更加简便地求解递归式;
上述递归式表示,将原来规模为\(n\)的问题分解为\(a\)个子问题,每个子问题的规模为\(n/b\),其中\(a\)和\(b\)都是正常数。\(a\)个子问题递归地进行求解,每个花费时间为\(T(n/b)\)。函数\(f(n)\)包含了问题分解和子问题解合并的代价。
主定理的具体内容如下:
令\(a\ge{1}\)和\(b>1\)是常数,\(f(n)\)是一个函数,\(T(n)\)是定义在非负整数上的递归式:
其中我们将\(n/b\)解释为\(\lfloor n/b \rfloor\)或\(\lceil n/b \rceil\)。那么\(T(n)\)有如下渐近界:
- 若对某个常数 \(\varepsilon > 0\)有\(f(n)=O(n^{\log_b^{a-\varepsilon}})\),则\(T(n)=\theta(n^{\log_b^a})\)。
- 若\(f(n)=\theta(n^{\log_b^a})\),则\(T(n)=\theta(n^{\log_b^a}\lg^n)\)。
- 若对某个常数\(\varepsilon>0\)有\(f(n)=\Omega(n^{\log_b^{a+\varepsilon}})\),且对某个常数\(c<1\)和所有足够大的\(n\)有\(af(n/b)\le{cf(n)}\),则\(T(n)=\theta(f(n))\)。
课后习题
4.5-1
对下列递归式,使用主方法求出渐近紧确界。
a. \(T(n) = 2T(n/4) + 1\)
b. \(T(n) = 2T(n/4) + \sqrt{n}\)
c. \(T(n) = 2T(n/4) + n\)
d. \(T(n) = 2T(n/4) + n^2\)
4.5-2
Caesar教授想设计一个渐近快于Strassen算法的矩阵相乘算法。它的算法使用分治方法,将矩阵分解为\(n/4 * n /4\)的子矩阵,分解和合并步骤共花费\(\theta(n^2)\)时间。他需要确定,它的算法需要创建多少个子矩阵,才能击败Strassen算法。如果它的算法创建\(a\)个子问题,则描述运行时间\(T(n)\)的递归式为\(T(n)=aT(n/4) + \theta(n^2)\)。Caesar教授的算法如果要快于Strassen算法,\(a\)的最大整数值是多少?
由题意可得\(n^{\log^a_4} < n^{\log^7_2}\),计算结果为\(a < 49\),所以\(a\)的最大整数值为48。
4.5-3
使用主方法证明:二分查找递归式\(T(n) = T(n/2)+\theta(1)\)的解是\(T(n) = \theta(\lg^n)\)。
4.5-4
主方法能应用于递归式\(T(n)=4T(n/2) + n^2\lg^n\)吗?请说明可以或者为什么不可以。给出这个递归式的一个渐近上界。
//todo