回溯算法
回溯算法也叫试探法,是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。在探路的过程中一般使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。
从前面对回溯算法的说明可以看到,回溯的本质是穷举,穷举所有可能,然后选出想要的答案,只是在穷举的过程中可以根据一些条件避免无效的遍历,这个避免的过程也叫剪枝。
所以回溯法并不是什么很高效的算法,那么既然回溯法并不高效为什么还要用呢?因为一些问题只能靠暴力搜索,没有更高效的解法。
适用场景
组合问题:N个数里面按一定规则找出k个数的集合;
切割问题:一个字符串按一定规则有几种切割方式;
子集问题:一个N个数的集合里有多少符合条件的;
子集排列问题:N个数按一定规则全排列有几种排列方式;
棋盘问题:N皇后,解数独等等。
回溯算法的一般有通用的解题步骤:
1.定义一个解空间,它包含问题的解;
2.利用适于搜索的方法组织解空间,一般是个树;
3.利用深度优先法搜索解空间;
4.利用剪枝函数避免移动到不可能产生解的子空间。
所说的解空间,一般会转化成树(即解空间树),也就是说回溯法解决的问题都可以抽象为树形结构,因为回溯法解决的都是在集合中递归查找子集,所以回溯法是在一颗高度有限的N叉树上进行遍历。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Web304030!