分治策略主要利用递归来解决问题,它包括以下三个步骤:
分解:将问题分解为一与原问题类似并且比原问题规模更小的子问题
解决:当分解的子问题足够小时,直接给出答案,否则用递归打方式求解
合并:将子问题的解合成原问题的解
下面考虑一个简单的利用分治算法的归并排序的例子
问题的形式化描述如下:
输入:A是 一个全序关系,A[p,q]是这个全序关系上的一部分
输出:将A[p,q]部分进行排序
下面是分治策略的伪代码:
MERGE(A,p,q,r)
1 n1 = q-p+1
2 n2 = r-q
3 Let L[1..n1=1] and R[1..n2+1] be new arrays
4 for i = 1 to n1
L[i ] = A[p + i -1]
5 for j = 1 tp n2
R[j] = A[q +j]
6 L[n1 + 1] = ∞
7 R[n2 +1] = ∞
8 i = 1
9 j = 1
10 for k= p to r
if L[i] <=R[j]
A[k] = L[i]
i++
11 else A[k] = R[j]
j++
MERGE-SORT(A,p,r)
1 if p < r
2 q = [(p = q)]/2
3 MERGE-SORT(A,p,q)
4 MERGE-SORT(A,q+1,r)
5 MERGE(A,mp,q,r)
下面按照上面的三个步骤分析该算法
第一步:分解
MERGE-SORT函数中的第二行将数组分成了两个元素较少的子数组,分别是从p-q和q+1 - r
第二步:解决
MERGE-SORT函数中的第三第四行分别对两个子数组进行递归调用,当数组中只有一个元素时,结束方法,排序完毕
第三步:合并:
MERGE函数将两个已经排好序的子数组合并成一个排序的大数组,在MERGE-SORT函数中调用此方法来将两个子数组合并成一个大的数组
我们可以用树的形式来表示算法的执行过程,利用递归树来进行分治算法的分析是一个十分有效的方法
通过递归树,我们可以得出此算法的时间复杂度O(nlgn)
参考书籍:算法导论(第三版),(美)Cormen等著,殷建平等译,机械工程出版社,2013.1
(转载请标明出处作者)