回溯算法(Backtracking)

什么是回溯?

回溯是一种基本的搜索算法,通过在搜索过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路经。在探索过程中,当探索到某一步时,发现原先搜索并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

搜索方式:

  • 深度优先搜索(dfs)
  • 宽度优先搜索(bfs)

基本思想

在包含问题的所有解的空间树中,按照dfs的策略,从根结点出发深度探索空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。

若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。

而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。

算法基本步骤

  1. 满足一定条件下将当前数据加入到结果集(或检查到不满足要求当即返回)
  2. 选择一条路经
  3. dfs向前进行
  4. 回退路经

一些情况下需要对数据进行预先处理,或在第2步直接检查以决定是否抛弃当前路经,以避免过多地递归,带来时间损耗。换而言之,不满足条件的路经越早抛弃越好。

原文地址:https://www.cnblogs.com/johnnyzhao/p/12341785.html