算法——分治算法

分治策略主要利用递归来解决问题,它包括以下三个步骤:

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

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

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

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

问题的形式化描述如下:

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

(转载请标明出处作者)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值