DFS : Depth First Search 不撞南墙不回头
-
Bachtracking和Depth First Search和Generate bit Mask的区别
Bachtracking:使用的是DFS方法,目的是求问题的解,如果在DFS过程中发现不是问题的解那么久回溯到上一个节点
DFS:遍历整个搜索空间不管是否是问题的解
Generate bit Mask:是DFS的一种替代实现方法
-
算法框架模板
result = []
def backtrac(路径,选择列表)
if 满足条件:
result.add(路径)
return
for 选择 in 选择路径:
做选择
backtrack(路径,选择列表)
撤销选择
- 一般场景
- 模板dfs,mask举例dfs
- 外部空间dfs(用stack写成iterative way,for example tree traversal)
- dfs+memo(DP剪枝)
- 使用在模拟流程,寻找所有情况全排列解
- 经典例题
94 额外空间的DFS
78 直接backtracking模板,因为没有任何限制条件,所以遇到全部情况都放入res,注意tmp引用需要新建一个ArrayList<>()
90 有重复数字需要1 sort 2 每个重复数字只第一个进loop的时候加一次
46 没有重复数字,每次都从头开始取数字,已经有了就不要了,也可以用set来优化时间复杂度 T(n)=O(N!) list.contains()的时间复杂度是O(N),比较差
47 如果一个数值已经被用过了,才去加入队列,如果前边的相同值没有用过则跳过
77 相当于数学题4个小球取2个的取法
T ( n ) = C N k = N ! ( N − k ) ! k ! T(n)=C_N^k={{N!}\over{(N-k)!k!}} T(n)=CNk=(N−k)!k!N!37 数独 sudoku solver 暴利尝试所有解,把有空的地方所有数字都试一遍
51 N皇后问题
-
总结
优缺点:
BFS:踊跃解决最短或者最少问题特别有效,而且寻找深度小,但缺点是比较耗内存(需要开大量的数组单元用来存储状态)
DFS:对于解决遍历和求解所有问题有效解,对于问题搜索深度小的时候处理速度迅速,然而在深度很大的情况下效率不高
DFS的优点
内存开销小,每次只需维护一个节点
能处理子节点较多或树层次过深的情况(相比BFS)
一般用于解决连通性问题(是否有解)
DFS的缺点
只能寻找有解但无法找到最优解(寻找最优解需要遍历所有路径)