回溯法 有通用的解题法之称。用它可以系统的搜索问题的所有解。回溯法是一个既带有系统性
又带有跳跃性的搜索算法。它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树,算法
搜索到解空间的任一节点时,先判断该节点是否包含问题的解。如果肯定不包含,那么跳过对该
节点为树的子树的搜索的,逐层向其祖先节点回溯,否则进入该子树,继续按深度优先策略搜索,回溯
法求问题的一个子解时,只要搜索到问题的一个解就可以结束了。这种以深度优先方式系统搜索问题解的算法称
为回溯法。它适应用解组合数较大的问题。
1.回溯法的算法框架
用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含问题的一个最优解。例如,对于有n种可选择物品的
0 1 背包问题,其解空间由长度为n的01 向量组成的,该解空间包含对遍历的所以01赋值
回溯法搜索解空间树时,通常才用两种策略避免无效的搜索,提高回溯法的搜索效率。其一是用约束函数在扩展节点处
剪去不满足约束的子树,其二是用限界函数剪去得不到的最优解的子树,这两类函数通常称为剪纸函数。
回溯法求解的三个步骤
1.针对问题,定义问题的解空间
2.确定容易搜索的解空间结构
3.以深度优先方式搜索解空间,并在搜索过程中用剪纸函数避免无效的搜索结果
方法1.递归回溯(递归调用函数本身)
回溯法对解空间进行深度优先的搜索,因此,在一般的情况下可用递归方法实现回溯法。
方法2.迭代回溯 (一般使用while或者for循环,将问题慢慢扩展到全部,前一次的结果被后一次的结构使用)
采用树的非递归深度优先遍历算法,可将回溯法表示为一个非递归迭代过程
用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间,在任何时刻,算法只是保存从根节点到当前扩展节点
的路径。如果解空间树中从根节点到叶节点的最长路径的长度为h(n),则回溯法所需的计算空间通常为o(h(n)),而显式地存储整个解空间
那么需要O(h(n)!)
子集树与排列树
当所给的问题是从n个元素的集合S中找出S满足某种性质的子集时,相应的解空间称为子集树。比如,n个物品的0-1背包问题所相应的解空间
树是一颗子集树,这类子集树通常有2^n个叶节点,其节点总个数有2^n-1,遍历子集树的算法需要 2^n的空间复杂度
当所给问题是确定n个元素满足某种性质的排列时,相应的解空间树称为树排列树通常有n!个叶节点,因此遍历排列树需要n!空间复制度。