在分治策略中,我们递归地求解一个问题,在每层递归中应用如下三个步骤:
分解 -> 将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小
解决 -> 递归地求解出子问题。如果子问题的规模足够小,则停止递归,直接求解
合并 -> 将子问题的解组合成原问题的解
三种求解递归式的方法,即得出算法的时间复杂度的方法:
代入法:猜测一个界,然后用数学归纳法证明这个界是正确的
递归树法:将递归式转换为一棵树,其结点表示不同层次的递归调用产生的代价。然后采用边界和技术来求解递归式
主方法:可求解形如下面公式的递归式的界:
T(n) = aT(n/b) + f(n) 其中a>=1,b>1,f(n)是一个给定的函数
它刻画了这样一个分治算法:生成a个子问题,每个子问题的规模是原问题规模的1/b,分解和合并步骤总共花费时间为f(n)
1. 最大子数组问题:
FIND-MAX-CROSSING-SUBARRAY(A,low,mid,high)
left-sum = negative infinity
sum=0
for i=mid down to low
sum = sum + A[i]
if sum > left-sum
left-sum=sum
max-left=i
right-sum = negative infinity
sum=0
for i= mid+1 up to high
sum = sum + A[i]
if sum > right-sum
right-sum=sum
max-right=i
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=ceiling((low+high)/2)