递归与分治策略

任何可以用计算机求解的问题所需要的计算时间都与问题的规模相关。规模越小,求解时间往往越短,也容易处理。要想解决一个规模较大的问题,有时会很困难。分治策略是将一个难以解决的问题分割成一些规模较小的问题,然后降低问题的处理难度。如果分割成的小规模问题都是可解的,就可以利用小规模问题的解求解出原问题的解。在这种情况下可以不断使用分治策略,使问题的规模不断的缩小,这样子问题缩小到很容易求解出解。由此自然引出递归算法。

使用分治策略的注意事项:

a:问题可以被分割

b:分割后的问题全部都有解

c:反复时候分治时仍然满足a和b

分治策略一般算法设计模式:

divide-and-merge(n){
     if(n<=n0)process(n);// 问题规模可以直接解决的子问题
     divide n into smaller subinstances n1,n2, ... ... ,nk; //分治
     for(i=1;i<k;i++){
         yi=divide-and-merge(ni); //递归
     }
      return merger(y1,y2, ... ... , yk);//合并子问题的解
}

递归算法:直接或者间接地调用自身的算法

递归函数:用函数自身给出的定义的函数

例如:二叉树的定义是一种递归定义,遍历算法是递归算法,遍历函数是递归函数。


分治策略设计出的算法一般是递归算法,所以分治策略的算法计算效率可以用递归方程来进行分析。

T(n)<= O(1)      n=0

T(n)<=kT(n/m)+f(n)      n>1

n为原问题的规模,n/m为k个子问题的规模,T(n)为问题规模为n的计算时间,f(n)为k个子问题的解合并为原问题解所需要的时间。


遵循以上的思想指导可以采用分治策略设计递归算法来解决问题。如何将递归算法替换为非递归算法需要根据实际情况做进一步的判断。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值