算法初步:回溯法

原创 by zoe.zhang


 

  首先感谢并推荐以下三篇博文,在回溯法方面整理得很好

      http://blog.csdn.net/chinajane163/article/details/48969353

      http://blog.csdn.net/hguisu/article/details/7709276

      http://blog.csdn.net/versencoder/article/details/52071930

      http://www.cnblogs.com/wuyuegb2312/p/3273337.html#q1

1.通用解题法:回溯法

  回溯法有通用解题法的美称,从算法名称上可以看出来,回溯是指在整个解空间从上向下搜索(按深度优先搜索),如果发现不满足搜索条件的节点,则返回上一个节点进行搜索。

  所以使用回溯法,首先要确定所有解的解空间,以及解的约束条件,用于避免搜索不必要的解。

  1)定义:有组织地搜索解空间,按深度优先搜索,从根节点开始搜索解空间树,半段该结点是否包含该问题的解,如果肯定不包含,则跳过该结点为根的子树搜索,退回上一步重新选择,也就是回溯的过程。

  2)适用类型:需要求出解集,全部解,或者那些解是满足约束条件的最优解。(一般该类求出全部解的组合数很大,通常呈阶乘式增长,简单搜索容易出现超时)

  3)特性:搜索过程中动态产生解空间。

2.回溯法的实现步骤:

  1)构建问题的解空间

  2)易于搜索问题的解空间结构;

  3)提高回溯效率的约束函数或者限界函数,这些函数统称为剪枝函数。 回溯法可以看做是:穷举+剪枝的结合。

  上面这些都是对回溯法一些定义和解释,有些弯弯绕绕,重点来说还是应该多练习和加强灵活理解,才能够把back-tracking 活学活用。

  在程序上的实现:

  1)一般为递归形式,一层层递归下去,如果发现条件不满足,停止往下递归,返回上层递归。递归适用于递归深度不特别大的情况,否则容易出现递归过深,堆栈溢出的情况。

  2)迭代实现。

  回溯法通常用来解决两类问题:一种是子集树问题,也就是n个元素的满足某种性质的子集S的个数,一种是排列树,即n个元素满足某种性质的排列。回溯法有模板,但最好不要拘泥于模板,它可以解决不限于子集树和排列树的问题,因此还是那句话,加强练习,自己耐心琢磨和体会。

3.例子:

待补充。

 

 

posted @ 2017-06-06 17:16  安安zoe  阅读(225)  评论(0编辑  收藏  举报