一、DFS(回溯为例)
1. 基本概念
- 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯算法遵循深度优先搜索策略。
2.回溯法的代码框架
- 回溯算法实际上是一种暴力穷举的算法,它的穷举过程就是遍历一颗多叉树的过程,其代码框架类似于多叉树遍历的代码框架
List<Value> result;
public void backtrack(路径, 选择列表){
if(满足结束条件){
result.add(路径);
return;
}
for(选择 : 选择列表){
进行剪枝;
做选择;
backtrack(路径, 选择列表);
撤销选择;
}
}
3. 回溯算法解题步骤
- 确定问题的解空间
- 确定易于搜索的解空间结构, 将解空间组织成树或图的形式
- 以深度优先方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索,剪枝函数可分为约束函数和限界函数
- 约束函数:在扩展结点处剪去不满足约束的子树
- 限界函数:剪去得不到最优解的子树
4. 对于回溯算法自己的理解
- 回溯算法本质上就是列出所有的可能性,然后从中寻找符合条件的,添加到最终结果中
- 回溯算法的解空间可以写成多叉树的形式,根节点是给定的数组,在每一个节点处,我们要做的操作都相同(暂时理解为都是遍历),因此为使用递归提供了条件
- 对于每个节点,我们的操作都是:遍历 == > 剪枝 ==> 将该节点加入中间结果 > 对子节点进行相同操作(递归)> 将该节点从中间结果中去除
- 对于终止条件,我们的操作是:存储最终结果 ==> 结束递归
二、刷题经历
2022.05.10