递归之分而治之

        什么是分而治之呢?相信大家都会有这样的疑问。在语言角度我们知道,这个成语有两个意思,第一个是分别治理的意思, 另外一个是利用手段使国家、民族或宗教等产生分裂,然后对其进行控制和统治。
       那么在我们日常编码中,类似地,分而治之也就是把原问题分解为几个类似原问题的子问题,解决完子问题,再把子问题的解合并在一起,就可以得到原问题的解。简单一点来说就是按部就班,把一个难解的问题分解为自己熟悉的小问题,然后循序渐进地一个一个解决这些小问题,逐个击破,这样的思想也是分而治之的核心思想。
        分治算法一般包括三个过程:
         分解:将原问题分解成若干个子问题。
         解决:递归求解各自子问题,如果子问题足够小,直接求解。如果子问题还是足够大就要继续分解。
         合并:合并这些子问题的解,即可得到原问题的结果。
        我们平时编码中用的最多的函数和递归策略就是这个思想,函数是一种功能的抽象,利用它可以将复杂的大问题分解成一系列简单的小问题,而后将小问题继续划分成更小的问题,当问题细化带足够简单时,就能分而治之。这种自顶向下的思想以后不管是在工作还是学习都会运用到很多次。函数可在一个程序中的多个位置使用,也可用于多个程序,当我们需修改代码时,只需要在函数中修改一次,所有调用位置的功能都要更新了,这种代码重用降低了代码行数和代码维护的难度。就像是图书馆的体制,每本书都有自己存在的特定位置,每一类书籍都有自己存在的方位,每本书都有自己存在的意义,绝对不是凭空出现,正是千千万万不同的书籍才组成了我们见到的井然有序的图书馆。
        这种思想在我们引用的算法中广有引用,归并排序就是一种经典例题。它的排序思想主要分三步构成:
         第一步:
         把前一半排序
         把前一半的前一半排序
         把前一半的后一半排序
         第二步:
         把后一半排序
         把后一半的前一半排序
         把后一半的后一半排序
         第三步:
         把两半归并到一个新的有序数组,然后在拷贝回原数组,排序完成
        运用分而治之的思想能够很快地解决这类问题,达到事半功倍的效果。快速排序也是一个很好的例子,它也只要三步就能够完成:
         第一步:
         设x=a[0],将x移动到适当的位置,使得比x小的元素都位于x的左边,比x大的元素都位于x的右边,和x相等的,放哪里都可以。 O(n)  时间完成。
         第二步:
         把k左边的部分运用相同的方法快速排序
         第三步:
          把k右边的部分运用相同的方法快速排序
        这样的例子数不胜数,输出前m大的数、求排列的逆序数...生活中任何情况下我们都可以运用这样的思想,在处理复杂事件,自己毫无头绪的时候,采用“分而治之”方法具有普遍性,这样做成事的概率高很多,达到事半功倍的效果!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南风如意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值