分治、回溯的实现和特性

273 阅读2分钟

分治和回溯其实本质上就是一个递归,这里单独拎出来讲解,你可以理解分治和回溯就是一种特殊或者较为复杂的递归即可。可以这么说,遇到一个需要递归的题目,我们会分析它的重复项,最近重复项的话,根据重复项怎么构造、怎么分解就有了分治、回溯之类的各种办法,最优重复性的话就是动态规划~

分治

什么是分治

分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

分治的递归状态树

示例

看一个比较傻的问题,我们要把全部英文字母转成大写,分治的思路就是把问题拆分成单个字母转成大写,再组装结果返回的过程。

在计算机科学中,分治法就是运用分治思想的一种很重要的算法。分治法是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)等等。 跟一般的递归相比,分治多了一步合并子结果得到最终结果的过程。

回溯

什么是回溯

回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其他的可能的分步解答再次尝试寻找问题的答案。

回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:

  • 找到一个可能存在的正确答案
  • 在尝试了所有可能的分步方法后宣告该问题没有答案

在最坏的情况下,回溯法会导致一次复杂度为指数时间的计算。

最典型的应用是在八皇后或者数独上面。