斯坦福 Algorithms: Design and Analysis 1 第二周笔记
来自斯坦福网站的Algorithms: Design and Analysis,与目前coursera上的版本内容没有变化,不过时间安排略有不同。
1 The Master Method
这个方法是一个用来在数学上分析递归算法计算复杂度的常用方式。
1.1 介绍
比如第一周课程里讲到的关于两个整数乘法的递归算法。naive的算法是每次递归成4个更小的整数乘法,复杂度的递推式为 T ( n ) ≤ 4 T ( n / 2 ) + O ( n ) T(n) \leq 4T(n/2) + O(n) T(n)≤4T(n/2)+O(n),而改进版本是每次递归成3个更小的整数乘法,递推式为 T ( n ) ≤ 3 T ( n / 2 ) + O ( n ) T(n) \leq 3T(n/2) + O(n) T(n)≤3T(n/2)+O(n)。the master method就是用来分析比较这种形式的算法复杂度。
这个方法是一个可以直接应用的公式,相当于一个黑箱。它的应用前提是每次递归分成的小的问题是同样大小的(整数除不尽的那种也可以)。其正式描述如下:
而对应这个问题描述,相应的算法复杂度结果如下:
1.2 举例
可以举几个例子来验证这个方法的正确性。
- 归并排序: a=2,b=2,d=1对应第一种,结果是 O ( n l o g n ) O(nlogn) O(nlogn)。
- 二分查找: a=1,b=2,d=0对应第一种,结果是 O ( l o g n ) O(logn) O(logn)。
- naive的递归整数乘法: a=4,b=2,d=1对应第三种,结果是 O ( n 2 ) O(n^{2}) O(n2)。
- 高斯改进的递归乘法: a=3,b=2,d=1对应第三种,结果是 O ( n 1.59 ) O(n^{1.59}) O(n1.59)。
- strassen矩阵乘法: a=7,b=2,d=2对应第三种,结果是 O ( n 2.81 ) O(n^{2.81}) O(n2.81)。
- 假设一个递归: a=2,b=2,d=2对应第二种,结果是 O ( n 2 ) O(n^{2}) O(n2)。
1.3 证明
将当前的条件与假设写成如下形式:
可以考虑利用在归并排序中用过的递归树的形式来完成证明。用递归树的方式最重要的一条就是计算出每一层中有多少个subproblem,每个subproblem有多少数据。
在当前假设下,第j层中有 a j a^{j} aj个subproblem,而每个subproblem有 n / b j n/b^{j} n/bj个数据。递归树一共有 l o g b n log_{b}n logbn层。于是在第j层中,所有的计算量的上限为: a j ∗ c ∗ ( n b j ) d = c n d ∗ ( a b d ) j a^{j}*c*(\dfrac{n}{b^{j}})^{d} = cn^{d}*(\dfrac{a}{b^{d}})^{j} aj∗c∗(bjn)d=cnd∗(bda)j。最后将每一层的计算量加起来,得到整个算法的计算量为: t o t a l w o r k ≤ c n d ∗ ∑ 0 l o g b n ( a b d ) j total work \leq cn^{d}*\sum_{0}^{log_{b}n}(\dfrac{a}{b^{d}})^{j} total