分治法

分治法在每一层递归上都有三个步骤:
分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;
合并:将各个子问题的解合并为原问题的解。
它的一般的算法设计模式如下:
Divide-and-Conquer(P)
1. if |P|≤n0
2. then return(ADHOC(P))
3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk
4. for i←1 to k
5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi
6. T ← MERGE(y1,y2,...,yk) △ 合并子问题

7. return(T)


1、给定一个顺序表,编写一个求出其最大值和最小值的分治算法。

void PartionGet(int s,int e,int *meter,int *max,int *min)

{

    if(e-s <= 1) do_sth, return;

    i = s + (e-s)/2; /* 不是子问题继续分治,这里使用了二分,也可以是其它 */
    PartionGet(s,i,meter,max,min);
    PartionGet(i+1,e,meter,max,min);

}


2、合并排序


3、快速排序


4、折半查找


5、二叉遍历树



todo: 大整数乘法,矩阵乘法的分治策略,最近点对,凸包问题



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值