分治法

分(divide):递归解决较小的问题

治(conquer):从子问题的解构建原问题的解

一般认为正文中至少含有两个递归调用才叫分治,只包含一个递归的不叫分治。一般认为子问题是不相交的。

方程的解为:

整数相乘

求两个N位数X和Y的乘积,手算需要进行次乘法,即把两个个位数相乘看作基本操作的话,算法复杂度为。X=12345678,Y=87654321,求XY。XL=1234,XR=5678,YL=8765,YR=4321。X=XL104+XR,Y=YL104+YR

所以:

需要进行4次4位数的乘法,乘以108只是一些补0操作,再加上几次加法构成了。

由(1)式得,此时算法没有得到改进。

注意到,所以在计算出后,只需要再进行一次乘法就能计算出

当两个数都是1位时可以通过查表进行乘法。

实际上上述方法在实际中很少用,对于小的N开销大,对于大的N还存在更好的一些算法,它们也广泛利用了分治算法。

矩阵乘法

一个N×N的矩阵乘法变成了8个N/2×N/2的矩阵乘法和4个N/2×N/2的矩阵加法,加法的复杂度为

由(1)式得

看来矩阵分块后再进行乘积并没带来复杂度的降低。

Strassen使用了类似于整数乘法的分治策略。

  计算7个N/2×N/2阶矩阵的乘法

然后

由(1)式得

当然要考虑N不是2的整次幂的情况。在N不是很大时Strassen算法不如矩阵直接相乘,它也不能推广到稀疏矩阵,而且不易并行化。当用浮点项运算时,在数值上不如经典算法稳定。算法稳定性是指:舍入误差在算法计算过程中是可控的。

你可能感兴趣的:(分治法)