减少子问题数
依据
分治算法的时间复杂度方程
W(n)=aW(n/b)+d(n)
a:子问题数,n/b:子问题规模,d(n):划分与综合工作量。
当a比较大,b较小,d(n)不大时,方程的解:W(n)=Θ(nlogba)。
减少a是降低函数W(n)的阶的途径。
利用子问题的依赖关系,使某些子问题的解通过组合其他子问题的解而得到。
例1. 整数位乘问题
输入:X,Y是n位二进制数,n=2k
输出:XY
普通乘法:需要O(n2)次乘运算
简单划分,令
X=A2n/2+B,Y=C2n/2+D.
XY=AC2n+(AD+BC)2n/2+BD
可以得到:
W(n)=4W(n/2)+O(n)→W(n)=O(n2)
这种划分并没有改善效率,子问题数目为4。
子问题间的依赖关系:代数变换
AD+BC=(A−B)(D−C)+AC+BD
AC,BD可以利用之前的解,所以优化后为三个子问题。
算法复杂度:
W(n)=3W(n/2)+cnW(1)=1
方程的解:
W(n)=O(nlog3)=O(n1.59)
例2. 矩阵相乘的问题
输入:
输出:
小结
-
适用于:子问题个数多,划分和综合工作量不太大,时间复杂度函数为W(n)=Θ(nlogba)
-
利用子问题之间的依赖关系,用某些子问题解的代数表达式表示另一些子问题的解,减少独立计算子问题的个数。
-
综合解的工作量可能会增加,但增加的工作量不会影响W(n)的阶。
增加预处理
例子:平面点对的问题
输入: 平面点集P中有n个点,n>1
输出:P中的两个点,其距离最小
蛮力算法:C(n,2)个点对,计算最小距离,O(n2)
分治策略:P划分为大小相等的PL和PR
-
分别计算PL,PR中最近点对
-
计算PL与PR中各一个点的最近点对
-
上述情况下的最近点是解。
总结