详细讲解回溯算法(一)

详细讲解回溯算法(一)本篇博文先不根据样例讲解算法 我会在接下的博文中一一讲解回溯法的具体运用 这里先详细讲解回溯算法的原理和思路 在了解回溯算法之前 先对回溯算法中涉及的知识点的概念先讲解下 方便理解博文 哈哈大家不要嫌啰嗦 可能都想直接了解什么是回溯法 但基础不好 后面的运用又怎能彻底掌握呢 不要嫌麻烦 多点耐心 这个其实很容易就理解的 嗷嗷嗷 1 1 问题的解空间一个复杂问题的解决方案是由若干

本篇博文先不根据样例讲解算法,我会在接下的博文中一一讲解回溯法的具体运用。

这里先详细讲解回溯算法的原理和思路。

在了解回溯算法之前,先对回溯算法中涉及的知识点的概念先讲解下,方便理解博文,,哈哈大家不要嫌啰嗦,可能都想直接了解什么是回溯法,但基础不好,后面的运用又怎能彻底掌握呢,不要嫌麻烦,多点耐心,这个其实很容易就理解的,嗷嗷嗷!!!

1.1问题的解空间

一个复杂问题的解决方案是由若干个小的决策步骤组成的决策序列,所以一个问题的解可以表示成解向量X=(x1,x2,…..xn),其中分量xi对应第i步的选择,X中个分量xi所有取值的组合构成问题的解向量空间,简称解空间或者解空间树(因为解空间一般用树形式来组织),由于一个解向量往往对应问题的某个状态,所以解空间又称为问题的状态空间树。

可行解:解空间中满足约束条件的解空间;

最优解:解空间中使目标函数取最大或者最小值的可行解

详细讲解回溯算法(一)

这里拿球数组a的幂集,来对解空间树进行讲解;

  解:解向量X=(x1,x2,x3),xi=1(1<=i<=3)表示选择ai.xi=0表示不选择ai。求解过程分为3步,分别对a的3个元素做决策(选择或不选择),对应的解空间图如上图所示,其中每个叶子结点都构成一个解,例如I结点的解向量为(1,1,0),对应解是(1,-2)。

一个问题的求解过程就是在对应的解空间中搜索以寻找满足目标函数的解,所以算法的设计的关键点;

(1):结点是如何拓展的,例如求幂集问题中,第i层结点的扩展方式就是选择ai和不选择ai两种;

(2):在解空间树种按什么方式搜索,一种是DFS,回溯法就是这种;另一种是BFS,分枝限界法是这种;

(3):解空间树通常是庞大的,如何高效地找打问题的解;

解空间树有两种类型。

子集树:所给的问题是从n个元素的集合S中找到满足某种性质的子集时,相应的解空间树。如上图

排列树:所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树。

需要注意的是,问题的解空间树是虚拟的,不需要在算法执行时构造一棵真正的树结构。

好了,啰嗦完了,下面讲解算法。

1.2什么是回溯法:

按照DFS算法的策略,从跟结点出发搜索解空间树。首先跟结点成为活结点(指自身已生成但其孩子结点没有全部生成的结点),同时也成为当前的扩展结点(指正在产生孩子结点的结点,也称为E结点)

在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为新的活结点,并成为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成了死结点(指其所有子结点均已产生的结点)。此时应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法以这种方式递归地在解空间中搜索,直到找到所要求的解或解空间中已无活结点为止。

所以回溯法体现出走不通就退回再走的思路。

这里注意:

1.由于采用回溯法求解时存在退回到祖先结点的过程,所以需要保存搜索过的结点。通常有两种:一:用子定义栈来保存;二:采用递归方法。

2.用回溯法通常采用两种策略避免无效搜索。一:用约束函数在扩展结点处剪除不满足约束条件的路径;二:用限界函数剪去得不到问题的解或最优解的路径。这两类函数统称为剪枝函数

这里归纳下,用回溯法求解的一般步骤:

(1)针对给定的问题确定问题的解空间树

(2)确定结点的扩展搜索规则。

(3)以深度优先方式搜索解空间树,并在搜索过程中可以采用剪枝函数来避免无效搜索。其中,深度优先方式可以采用递归回溯或者非递归(迭代)回溯。

好了,回溯法到这里就讲完了,有看不懂的可以问我,嗯嗯嗯。。。另外,我在讲点东西。

1,3回溯法与深度优先遍历的异同。

两者的不同点如下:

(1)访问的次序不同:深度优先遍历的目的是“遍历”,本质是无序的,重要的是是否被访问过,因此在实现上只需要对于每个位置是否被访问就足够了。回溯法的目的是“求解过程”,本质是有序的,也就是说必须每一步都是要求的次序。

(2)访问次数不同:深度优先遍历对已经访问过的顶点不再访问。回溯法中已经访问过的顶点可能再次访问。

(3)剪枝不同:深度优先遍历不含剪枝。

实际上,除了剪枝是回溯法的一个明显特征外(并非任何回溯法都包含剪枝部分),很难严格区分回溯法 与深度优先遍历。因为这些算法很多是递归算法,在递归调用中隐含着状态的自动回退和恢复。

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206514.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午3:31
下一篇 2026年3月19日 下午3:32


相关推荐

  • 中通笔试题:翻转字符串,例如abcd打印出dcba

    中通笔试题:翻转字符串,例如abcd打印出dcba翻转一个字符,比如:abcd—&gt;dcbapublic class 倒转字符串 { public static void main(String[] args) { System.out.print("翻转后字符串:" ); String str = "abcde"; for (int i = str.length()-1; i&gt;=0; i–) { S…

    2022年6月13日
    31
  • FilterRegistrationBean_hid event filter

    FilterRegistrationBean_hid event filter3.4  Struts 2的基本流程 经过前面介绍,我们已经基本了解了Struts 2框架的MVC实现。大致上,Struts 2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。在这3个部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。 3.4.1  核心控制器:Filte

    2022年8月16日
    12
  • 模板模式的使用总结

    模板模式的使用总结模版模式应该是工作中最常用的设计模式之一 直白的讲就是如果的一些处理方式是有一定的模版流程处理的 那么在应用中使用该模式在合适不过了 对于其基本的业务应用 我简单写了以下三个基本的通用模版 业务失败重试机制 业务前置检查流程模版 Thrift 远程调用处理模版 来展示 有问题的可以留言纠正 谢谢 版权声明 本文为 CSDN 博主 张彦峰 ZYF 的原创文章 遵循 CC4 0BY SA 版权协议 转载请附上原文出处链接及本声明

    2026年3月18日
    2
  • Qt5.12配置Android环境 只有platform sdk installed error的解决办法「建议收藏」

    Qt5.12配置Android环境 只有platform sdk installed error的解决办法「建议收藏」QtforAndroid环境配置platformsdkinstallederror的解决方案时隔一年半,又被Qt配置Android环境被这个强大的软件狠狠的按在地上摩擦。都是泪呀!因为项目需要,需要在高一点版本的Qt上面开发Android软件,本来我用Qt5.12.9用的好好的,但是因为配置Android环境要多了个openssl,而且一直就platformsdkinstalled有问题,查了各种方案,在sdkbuild-tools中没有低版本的platform就到各种网站上下载22

    2022年5月18日
    48
  • JS this指向总结

    JS this指向总结使用 JavaScript 开发的时候 很多开发者多多少少会被 this 的指向搞蒙圈 但是实际上 关于 this 的指向 记住最核心的一句话 哪个对象调用函数 函数里面的 this 指向哪个对象 下面分几种情况谈论下 1 普通函数调用这个情况没特殊意外 就是指向全局对象 window letusername cn functionfn alert this us

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号