斯坦福 Algorithms: Design and Analysis 1 第一周笔记
来自斯坦福网站的Algorithms: Design and Analysis,与目前coursera上的版本内容没有变化,不过时间安排略有不同。
INTRODUCTION
1.1整数乘法
两个整数相乘的计算,即c=xy。假设x和y的位数是n,而以每个一位数的加法或乘法为基本操作,可得xy的计算中使用最原始的按位相乘然后相加的算法时需要的基本操作数量是 n 2 n^{2} n2级别。举例如下,两个4位数相乘,每一行都要至少进行4次基本操作,共有4行:
但我们却可以做到更好。改良的算法叫做Karatsuba Multiplication,这是一个递归算法,计算x*y的结果流程如下:
- 令x= 1 0 n / 2 a + b 10^{n/2}a+b 10n/2a+b,y= 1 0 n / 2 c + d 10^{n/2}c+d 10n/2c+d
- x*y = ( 1 0 n a c + 1 0 n / 2 ( a d + b c ) + b d 10^{n}ac+10^{n/2}(ad+bc)+bd 10nac+10n/2(ad+bc)+bd),于是只需要继续计算式子里的ac,ad,bc,bd四项的积即可。
针对每次递归需要计算的ac,ad,bc,bd还有个优化。分别计算需要做4次乘法,而实际上我们关心的是ac bc与(ad+bc)三项。可以通过计算ac bc与(a+b)(c+d)三次乘法得到结果。
1.2 Merge Sort
归并排序是一个简单的分治算法。上述的整数乘法的优化也是一种分治算法。
排序算法的输入是一个无序数组,输出是一个有序数组。而归并排序算法流程如下:
- 递归地将当前数组的前一半与后一半分别排序
- 将排序好的前一半与后一半合并为有序的整体
这里忽略了递归至最后只有一个数的时候的处理。其中第二步合并的伪代码如下:
所以如果合并后的数组长度为m,那么每个合并操作的基本操作数 ≤ 4 m + 2 ≤ 6 m \leq 4m+2 \leq 6m ≤4m+2≤6m。
将递归过程画成高为 l o g 2 n log_{2}n log2n的一颗树:
第j行有 2 j 2^{j} 2j个排序问题,每个问题里数组长度为 n / 2 j n/2^{j} n/2j