您的位置:首页 > 其它

算法——分治算法

2015-11-01 09:18 190 查看
分治策略主要利用递归来解决问题,它包括以下三个步骤:

分解:将问题分解为一与原问题类似并且比原问题规模更小的子问题

解决:当分解的子问题足够小时,直接给出答案,否则用递归打方式求解

合并:将子问题的解合成原问题的解

下面考虑一个简单的利用分治算法的归并排序的例子

问题的形式化描述如下:

输入: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

(转载请标明出处作者)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: