分而治之思想
问题
在面对一个问题时,如何解决问题的思路如下。
分治思想
分治思想:
分而治之:分成子问题、解决子问题、合并子问题的解
- 一个复杂可解问题是可分的,即可以被化简为多个简单的子问题
- 子问题的解可以合并为复杂问题的解
如果满足以上两个条件,则称此问题是可分的,可以使用分治思想解决此问题。
判断是否可分治的条件
最大的前提条件是问题是可解的。
不是所有可解的问题都可分,我们通过观察问题的输入,如:
- 一个字符串的部分仍为字符串
- 一个集合的部分依然是集合
- 一棵树去除根节点分成若干子树(树的问题很多用到分治策略,只对根节点进行操作)
- 一个图的部分仍是一个图
同理,我们也可以观察问题的输出来判断子问题的解能否合并成复杂问题的解。
看input中的关键数据结构:
- 决定是否可分、怎么分(影响复杂度)
- 数据结构:数组、矩阵、Set、链表、树、DAG、一般的图
看output:
- 决定是否能把解和起来,如何合并