回溯法(backtrack)
有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。回溯法的基本做法是 搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。
回溯法在问题的解空间树中,按 深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。
算法过程
回溯法会用深度优先的方式搜索解空间,并在搜索的过程中用剪枝函数减去不可能产生最优解的子树,从而避免无效搜索。剪枝函数有两个,用 约束函数(constrain function) 可以在扩展结点处剪去不满足约束的子树;用 限界函数(bound function) 可以剪去得不到最优解的子树。
用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。如果解空间树中从根结点到叶结点的最长路径的长度为 h(n) ,则回溯法所需的计算空间通常为 O(h(n)) 。而显式地存储整个解空间则需要 O(2h