Java数据结构与算法——回溯法

一、基本概念

1、回溯法的定义

在问题的解空间树中,按深度优先搜索的策略,从根结点出发搜索解空间树。搜索至解空间树的任一节点时,先判断该节点是否包含问题的解。如果包含,则进入该节点的子树,继续按深度优先策略搜索;如果不包含,则跳过对该节点的子树的搜索,逐层向其祖先节点回溯。

相比于穷举式的搜索,回溯法能避免许多不必要的搜索,因此,回溯法适用于解一些组合数比较大的问题。

2、回溯法的解题步骤

  • 针对所给问题,定义问题的解空间;
  • 确定易于搜索的解空间结构;
  • 以深度优先搜索的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

(1)解空间树:

用回溯法求解问题,重点是设计问题的解空间树,解题过程即是深度遍历解空间树的过程。

根据待求解问题的特性,用树结构表示问题的解结构、用叶子表示问题所有可能的解的一棵树,即为解空间树

解空间树的形成过程:

把求解问题的过程当作一系列的决定来考虑,系统地分析每一个决定的所有可能的结果。每一个决定即为解空间树中的一个分支节点,各种可能的结果即为子树,问题最终所有可能的解即为所有的叶子。这便是解空间树的形成过程。

对解空间树进行遍历搜索,即可得到问题的全部解。

(2)剪枝函数:

在深度搜索解空间树的过程中,搜索至解空间树的任一节点时,要先判断该节点是否包含问题的解,如果不包含,则要进行“剪枝”,从而避免无效搜索。

回溯法的两个剪枝策略:

  • 约束函数剪去不满足约束的子树;
  • 限界函数剪去得不到最优解的子树。

Tips:

回溯法求解的特点是在搜索过程中动态产生问题的解空间。在任意时刻,算法只保存从根结点到当前结点的路径。

二、案例

案例一:N 皇后问题

案例二:一组数字的全排列

发布了56 篇原创文章 · 获赞 0 · 访问量 924

猜你喜欢

转载自blog.csdn.net/weixin_45594025/article/details/105005464
今日推荐