分治法往往运用于解决较为大型的问题,在处理大型问题的时间上(T(n)=一(nlgn))相较于暴力求解有着极大的优势,以下为分治法进行操作的具体步骤:
分解步骤:由于处理的问题较为大型,故分解成形式一致但规模较小的子问题对于问题的处理效率大有裨益,个人认为这也是分治法的核心。
解决步骤:用递归求解出子问题。当子问题的规模足够小的时候,停止递归,直接求解。
合并步骤:通过归并将子问题组合求出原问题的解。
分治法相关应用
1. 最大子数组问题
2. 矩阵乘法的运算(strassen算法)
等等。。。
最大子数组问题解析:
以下先给出伪代码:
FIND-MAX-CROSSING-SUBARRAY(A,low,mid,high)
left-sum=-∞
sum=0
for i=mid downto low
sum=sum+A[i]
if sum>left-sum
left-sum=sum
max-left=i
right-sum=-∞
sum=0
for j=mid+1 to high
sum=sum+A[i]
if sum>right-sum
right-sum=sum
max-right=j
return(max-left,max-right,left-sum+right-sum)
FIND-MAXIMUM-SUBARRAY(A,low,high)
If high==low
Return(low,high,A[low])
Else mid=[(low+high)/2]
(left-low,left-high,left-sum)= FIND-MAXIMUM-SUBARRAY(A,low,high)
(right-low,right-high,right-sum)= FIND-MAXIMUM-SUBARRAY(A,low,high)
(cross-low,cross-high,cross-sum)= FIND-MAX-CROSSING-SUBARRAY(A,low,mid,high)
If left-sum>=right-sum and left-sum>=cross-sum
Return(right-low,left-high,left-sum)
Elseif right-sum>=left-sum and right-sum>=cross-sum
Return(right-low,left-high,left-sum)
Else return(cross-low,cross-high,cross-sum)
思路:
取中点作为一个定位轴,则最小子数组的位置就有三种情况轴右边,轴左边,轴上,以这个思路把轴两边的子数组再次细分,这个过程我称之为递归中的递过程,在触底即high==low时开始进行归,每次归的都是当前定位轴所成子数组的最大子数组(子数组中的子数组),当进行到最后便是原数组中的最大子数组。
矩阵乘法(strassen算法)
SQUARE-MATRIX-MULTIPLY-RECURSIVE(A,B)
N=A.rows
Let C be a new n*n matrix
If n==1
C11=a11*b11
Else partition A,B and C as in equations n/2*n/2 matrix1
C11= SQUARE-MATRIX-MULTIPLY-RECURSIVE(A11,B11)+SQUARE-MATRIX-MULTIPLY-RECURSIVE(A12,B21)
C12= SQUARE-MATRIX-MULTIPLY-RECURSIVE(A11,B12)+SQUARE-MATRIX-MULTIPLY-RECURSIVE(A12,B22)
C21= SQUARE-MATRIX-MULTIPLY-RECURSIVE(A21,B11)+SQUARE-MATRIX-MULTIPLY-RECURSIVE(A22,B21)
C22= SQUARE-MATRIX-MULTIPLY-RECURSIVE(A21,B12)+SQUARE-MATRIX-MULTIPLY-RECURSIVE(A22,B22)
Return c
1: B= C同理
思路:此思路仅为偶数阶矩阵适用
递:先将大的矩阵按左上,左下,右上,右下平均分成4个小矩阵,照此细分直到触底即n=2为止,此时的矩阵乘法就可变为唯一不变的四个式子。
归:将算出的新矩阵即C,与另一个新矩阵C2再次做矩阵运算,如此归并直到成为原来的矩阵为止。
注:转载请注明出处。