基本步骤:
- 将问题分解成若干个相同的小问题(可以有特殊处理)
- 对每个小问题求解
- 将小问题的解合并起来(可以有特殊处理)
示例
bit位为n的整数相乘
- 常规算法,其复杂度为 O(n2)
- 现在将
x,y
表示成:
x=x1∗2n/2+x0y=y1∗2n/2+y0
x1,x0,y1,y0 各自只有 n/2 个bit位。我们需要知道 x1y1,x1y0+x0y1,x0∗y0 ,就可以求出 xy 的值。需要做四次运算,采用得到上面的值,所以复杂度没有降低,但是我们可以通过下面的方法将运算量从4次减到3次:
- 首先计算 (x1+x0)∗(y1+y0)=x0y0+(x0y1+x1y0)+x1y1
- 计算 x0y0
- 计算
x1y1
通过上面三步就可以得出我们想要的三组数据了,这样问题的复杂度变成了 T(n)=3T(n/2)+cn ,这个时候 d<logba ,所以问题的复杂度为 O(nlog23) ,这样就将问题的复杂度降低了。
规模为n的矩阵相乘
- 其基本方法的复杂度为 O(n3) 。
- 同理,我们也可以采用如整数相乘一样,采用分解与整合的方法来降低复杂度。
上面的算法是一个启发式的算法,所以其简化没有严密性的推理。
通过上面的方法我们就可以将复杂度从 O(n3) 降到 O(nlog27) 。