vlambda博客
学习文章列表

回溯法与深度优先搜索

LeetCode 22  括号生成

回溯法与深度优先搜索



这是一道典型的使用回溯法的题目。

回溯法:

回溯算法实际上类似于一个枚举的搜索过程,在搜索尝试的过程中寻找问题的解,当在某一节点发现已不满足求解条件时,就返回上一个节点尝试别的路径,称为“回溯”。简单讲就是,一条路往前走,能进则进,不能进则退回来,换一条路再尝试。

回溯法会把问题的解空间转化成图或者树的结构表示,然后进行遍历,再遍历过程中记录和寻找所有的可行解或者最优解。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一结点时,先利用剪枝函数判断该节点是否可行,如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。

回溯法的实现方式有两种,递归和递推。

回溯法和深度优先搜索(DFS)的关系:使用回溯法求解问题,会利用深度优先搜索。在DFS的过程中发现不是问题的解,那么就开始回溯到上一层或者上一个节点。DFS是遍历整个搜索空间,而不管是否是问题的解,所以更觉得回溯法是DFS的一种应用,DFS更像是一种工具。