【算法】分治算法

分治算法

1.定义

将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。

2.分治策略

“分而治之”,大问题能够拆成相似的小问题,记住这些小问题需要具有相似性。而后将小问题的每个解合成为大问题的解。所以说大问题如何拆,小问题如何合并才是这个算法最主要的一个思想。实际上很多算法如贪心算法,动态规划等等都是要求把大问题拆成小问题。而分治算法的重要一点就是要适用于能够重新把小问题的解合并为大问题的解。

3.使用分治算法的前提条件

  • 原问题与分解成的小问题具有相同的模式;
  • 原问题分解成的子问题可以独立求解,子问题之间没有相关性,这一点是分治算法跟动态规划的明显区别
  • 具有分解终止条件,也就是说,当问题足够小时,可以直接求解;
  • 可以将子问题合并成原问题,而这个合并操作的复杂度不能太高,否则就起不到减小算法总体复杂度的效果了

4.每一次递归都会涉及三个操作

  • 分解:将原问题分解成一系列子问题;
  • 解决:递归地求解各个子问题,若子问题足够小,则直接求解;
  • 合并:将子问题的结果合并成原问题。

5.分治法适用条件

  1.  该问题的规模缩小到一定程度就可以很容易解决;
  2.  该问题可以分解为若干个规模较小的相同问题,这里注意是最优子结构性质;
  3.  利用该问题分解出的子问题的解可以合并为该问题的解;
  4.  该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共子问题。

说明:

  • 对于很多算法而言,第一条往往是必要的,因为数据量一旦大起来,问题往往复杂度上升的特别快。这里就需要将这个大问题分解为小问题。小问题处理起来更加方便。
  • 第二、三条的才是分治思想的核心,因为很多时候我们会采用递归的方式进行解决,所以在大问题分解为小问题的时候需要保证小问题之间的相同性。
  • 单单分解为小问题之后还不能算完成,必须要能够将小问题的解合并为这个问题的最终解才能算真正用到了分治的思想。
  • 最后一条也是最关键的,各个子问题之间必须要保证独立性,即不互相影响。如果相互之间有影响,这时候我们采用的是动态规划就更加好一点。

6.案例

在各种排序方法中,如归并排序、堆排序、快速排序等,都存在有分治的思想。

posted @ 2022-03-17 23:01  HZX↑  阅读(115)  评论(0编辑  收藏  举报