开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天点击查看活动详情
分治
- 什么叫分治? 分治就是将原问题划分成若干个规模较小,但是结构与原问题相同或者相似的子问题,然后分别解决子问题,最后合并子问题的解,即可得到原来问题的解
- 我们将分治法分为3个步骤:
- 分解:将原问题分解为若干和原问题拥有相同或者相似结构的子问题
- 解决:递归求解所有子问题,如果子问题的规模小到可以直接解决,就直接解决它
- 合并:将原来子问题的解合并为原问题的解
- 我们将分治法分为3个步骤:
注意:只有原问题的子问题相互独立,没有交叉时,才能够用分治法,如果子问题有相交部分,那么便不适合用分治法。
通常情况下,我们将子问题个数为1的情况称为减治;将子问题个数大于1的情况称为分治。 分治作为一种算法思想,可以通过递归实现,也可以通过非递归实现,但是通过递归实现比较容易。接下来我们就介绍一下递归的含义。
递归
- 递归,通俗来讲,就是反复调用自身函数,但是每次都会将问题范围缩小,直到范围缩小到可以直接得到边界数据的结果。然后在返回的路上求出对应的解。此时看来,递归很适合分治思想
- 在递归的逻辑中,有两个重要概念:
- 递归边界
- 递归式
- 递归式就是将原问题分解成若干个子问题的手段,而递归边界则是分解的尽头,可以想象一下,如果不对递归式进行阻止,那么程序就如同一个无底洞无穷无尽。
那么如何在实际题目中找到递归式和递归边界呢?我们将在下一节通过示例进行介绍。