0
点赞
收藏
分享

微信扫一扫

Python版算法复习笔记(七):回溯算法

天行五煞 2022-04-01 阅读 43

概念

回溯法,即回溯搜索法。回溯是递归的副产品,只要有递归就会有回溯。深搜一般都用到了回溯法思想。

所有回溯法解决的问题都可以抽象为树结构。

利用回溯法解决的问题:(后接问题的时间复杂度和空间复杂度)

  • 组合问题:N个数中按一定规则找出k个数的集合 [ O ( 2 n ) O(2^n) O(2n), O ( n ) O(n) O(n)]
  • 切割问题:一个字符串按照一定规则有几种切割方法
  • 子集问题:一个N个数的集合里有多少符合条件的子集 [ O ( 2 n ) O(2^n) O(2n), O ( n ) O(n) O(n)]
  • 排列问题:N个数按一定规则全排列,有几种排列方式 [ O ( n ! ) O(n!) O(n!), O ( n ) O(n) O(n)]
  • 棋盘问题:N皇后 [ O ( n ! ) O(n!) O(n!), O ( n ) O(n) O(n)]、解数独 [ O ( 9 m ) O(9^m) O(9m), O ( n 2 ) O(n^2) O(n2)]

算法模板

回溯算法模板框架:

void backtracking(参数)
		if(终止条件):
			存放结果
			return
		for (选择:本层的集合中元素) :
			处理节点
			backtracking(路径,选择列表)  //递归
			回溯,撤销处理结果 (与处理节点步骤一一对应)

剪枝

回溯的本质是穷举,优化手段是剪枝。

剪枝的精髓在于:for循环在寻找起点的时候要有一个范围。如果这个起点到集合终点之间的元素已经不够题目要求的k个元素了,就没有必要搜索了。

剪枝可以有效的缩短时间,一般出现在:

  1. for循环阶段限制选择区间
for (选择:本层的集合中元素) :
  1. 在下列阶段用if/else的逻辑达到剪枝效果
处理节点
backtracking(路径,选择列表)  //递归
回溯,撤销处理结果 (与处理节点步骤一一对应)

重要 注意复习

代码随想录-回溯算法总结篇

举报

相关推荐

0 条评论