分治法(一)

1. 分治策略的基本思想

1.1 分治策略(Divide and Conquer)

  • 1 将原始问题划分或者归约为规模较小的子问题
  • 2 递归迭代求解每个子问题
  • 3 将子问题的解综合或合并得到原问题的解

注意:

  1. 子问题与原始问题性质完全一样
  2. 子问题之间可彼此独立地求解
  3. 递归停止时子问题可直接求解

理论很抽象,总结就是三步:分解–>解决–>合并,下面以三个具体的例子来进一步体会。

1.2 二分检索(查找)

在这里插入图片描述
该算法设计思想:

  • 通过 x 与中位数的比较,将原问题归约为规模减半的子问题,如果 x 小于中位数,则子问题由小于 x 的数构成,否则子问题由大于 x 的数构成。
  • 对子问题进行二分检索。
  • 当子问题规模为 1 时,直接比较 x 与T[m] ,若相等则返回 m ,否则返回 0。
    以上实现采用了迭代方式,读者考虑一下递归方式?

1.3 二分归并排序

在这里插入图片描述
该算法设计思想:

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

1.4 Hanoi 塔

在这里插入图片描述
该算法设计思想:

  • 将原问题归约为规模为n-1的2个子问题。
  • 继续归约,将原问题归约为规模为n-2的4个子问题。继续…当子问题规模为1时,归约过程截止。
  • 从规模1到 n-1,陆续组合两个子问题的解, 直到规模为n。

理论应用于实践方可深刻理解,下一篇博客将以分治法解决LeetCode上若干问题,并做详细讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值