持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
回溯算法
什么是回溯算法
百度百科上这样定义:
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
递归伴随着回溯,只要有递归就会有回溯。
回溯算法的效率
由于回溯的本质就是穷举,需要穷举所有的可能,然后选出需要的答案,所以回溯算法并不高效,即使进行了剪枝的操作,回溯算法也很低效。但是有一些问题一定要用回溯法来解决。
回溯算法解决的问题
- 组合问题:N个数里面按一定规则找出k个数的集合
- 切割问题:一个字符串按一定规则有几种切割方式
- 子集问题:一个N个数的集合里有多少符合条件的子集
- 排列问题:N个数按一定规则全排列,有几种排列方式
- 棋盘问题:N皇后,解数独等等
这些问题都是很困难的问题,回溯法解决的问题可以理解为树形结构,通过不断的分解子集,最终得出结果。这个分解的过程就像是构造树的过程。
回溯算法模板
在二叉树的递归算法中,我们总结了递归的三要素,对于回溯我们也可以总结出三个要素:
- 回溯函数模板返回值以及参数
回溯算法中,一般没有函数的返回值。参数需要在题目的分析中确定。
- 回溯函数终止条件
终止条件一般是搜索到叶子节点,将答案存起来,结束本次递归。
- 回溯搜索的遍历过程
回溯搜索的遍历过程就是使用for循环横向遍历使用递归纵向遍历。这样可以遍历到整个树形结构。