分治策略的基本思想

分治策略

分治策略的基本思想

分治策略( Divide and Conquer )
1、将原始问题划分或者归结为规模较小的子问题
2、递归或迭代求解每个子问题(独立求解)
3、将子问题的解综合得到原问题的解
注意:
1.子问题与原始问题性质完全一样
2.子问题之间可彼此独立地求解
3.递归停止时子问题可直接求解(子问题足够小,可以有直接的求解算法)

二分检索

检查x在数组T中是否出现

算法Binary Search (T, l,r, x)
输入:数组T,下标从l到r;数x
输出: j //若x在T中,j 为下标;否则为0

1.  l←1; r←n
2. while l <= r do
3. m←[ (l +r)/2]     // m为中间位置,如果x<m,转变成
4. if T[m]=x then return m // 如果x=m,就找到了x,x是中位数
5. else  if T[m]>x then r←m-1  //如果x比m小,转为前半个数组,归结成规模减半的子问题
6. else I←m+1  //否则就是x比m大,转为后半个数组,也归结成规模减半的子问题
7. return 0

二分检索算法设计思想
●通过x与中位数的比较,将原问题归结为规模减半的子问题,如果x小于中位数,则子问题由小于x的数构成,否则子问题由大于x的数构成.,
●对子问题进行二分检索.
●当子问题规模为1时,直接比较x与T[m],若相等则返回m,否则返回0. (这就是对规模最小的问题直接求解)

二分检索时间复杂度分析
二分检索问题最坏情况下时间复杂度
递推方程:W(n)= W( [n/2] )+1 //问题规模是n,即数组大小是n时,经过一次比较(即+1,这是一次比较的工作量),归结成规模不超过2/n的一个子问题
初值:W(1)= 1
可以解出
W(n)= [ logn ]+ 1

二分归并排序

算法Merge Sort (A,p, r)
输入:数组A[p…r]
输出:元素按从小到大排序的数组A

1. if p<r
2. then q← [ (p+ r)/2 ]  //对半划分,把数组分成前后两个数组,变成两个子问题
3.         Merge Sort (A,p, q)  //子问题1
4.         Merge Sort (A, q+1,r)子问题2
            //跟原来的算法是同一个算法,两个子问题递归求解 
5.         Merge (A,p, q, r)  //综合解,前半个数组和后半个数组都排好了,再将排好序的数组合并成原始数组

二分归并排序设计思想
● 划分将原问题归结为规模为n/2的两个子问题
● 继续划分,将原问题归结为规模为n/4的4个子问题.继续…,当子问题规模为1时,划分结束.
●从规模1到n/2,陆续归并被排好序的两个子数组.每归并一次,数组规模扩大一倍,直到原始数组。

二分归并排序时间复杂度分析

假设n为2的幂,二分归并排序最坏情况下时间复杂度
W(n)= 2W(n/2) +n-1 //2W(n/2)是两个子问题的工作量,n-1
初值:W(1)=0 // 规模是1的工作量是0次比较
可以解出
W(n)= nlogn-n+ 1

Hanoi塔的递归算法

算法Hanoi (A,C,n) // n个盘子A到C

1. ifn=1 then move (A,C) //1个盘子A到C
2. else Hanoi (A, B, n-1)  //把n-1个盘子从A移到B
3. move (A, C)  //上一步移好了之后直接把剩下的那个(最大的盘子)从A移到C
4. Hanoi (B, C,n-1)  //把B上n-1个盘子移到C

//把n个盘子的移动问题转为n-1个盘子的移动问题
设n个盘子的移动次数为T(n)
T(n)= 2 T(n-1)+ 1, //两个子问题的工作量:2 T(n-1),+1代表3.的一个盘子从A移到C移动一次
初值:T(1)= 1,
解:T(n)=2n-1

算法设计思想
●将原问题归结为规模为n-1的2个子问题.
●继续归约,将原问题归结为规模为n-2的4个子问题.继续…,当子问题规模为1时,归约过程截止.
●从规模1到n-1,陆续组合两个子问
题的解。直到规模为n.

小结

●将原问题归约为规模小的子问题,
子问题与原问题具有相同的性质.
●子问题规模足够小时可直接求解.
●算法可以递归也可以迭代实现.
●算法的分析方法:递推方程.

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值