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

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

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

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)剪枝不同:深度优先遍历不含剪枝。

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

详细讲解回溯算法(一)相关推荐

  1. SVM——详细讲解SMO算法优化两个变量以及变量的选择

    一.SMO(序列最小最优化)优化两个变量 以非线性支持向量机的对偶问题为例,使用SMO算法求解该对偶问题的最优参数α* . 非线性支持向量机的对偶问题如下: 对偶问题转换:(如何转换请看这篇博客) 存 ...

  2. 「leetcode」332.重新安排行程【回溯算法/深搜】详细图解!

    本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略.各个类型经典题目刷题顺序.思维导图,可以fork ...

  3. 排序算法-算法时间复杂度和空间复杂度概念 详细讲解

    排序算法-算法时间复杂度和空间复杂度概念 详细讲解 排序算法的介绍 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类: 1)内部排序: 指将 ...

  4. Leetcode学习之回溯算法

    文章目录 1. 回溯算法理论基础 什么是回溯法 回溯法的效率 回溯法解决的问题 如何理解回溯法 回溯法模板 回溯三部曲 a. 回溯函数模板返回值以及参数 b. 回溯函数终止条件 c. 回溯搜索的遍历过 ...

  5. leetcode的回溯算法题目用这个模板解题,一网打尽,so easy!!!

    " 这是本人第 46 篇原创博文,每周至少两篇更新,谢谢赏脸阅读文章 这一篇文章来讲解一下如何做leetcode回溯算法题目,这一段时间我把leetcode上面的回溯算法的题目都刷了个遍,发 ...

  6. “回溯”算法总结(深度优先遍历 + 状态重置 + 剪枝)

    地址:https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-b ...

  7. 回溯算法详细讲解(C语言)

    回溯算法实际上就是暴力枚举,只不过它有着递归的保护才得以由此美称,很多人也把该算法称作是万能解题法. 现在就让让我们一起走入这个使你头疼的算法吧. 要想讲解清楚这个算法还真不是一件容易的事情,所以能够 ...

  8. dijkstra标号法表格_Dijkstra算法详细讲解

    最短路径之 Dijkstra 算法详细讲解 1 最短路径算法 在日常生活中,我们如果需要常常往返 A 地区和 B 地区之间,我们最希望 知道的可能是从 A 地区到 B 地区间的众多路径中,那一条路径的 ...

  9. lamport面包店算法详细讲解及代码实现

    lamport面包店算法详细讲解及代码实现 1 算法详解 1.1 一个较为直观的解释 1.2 Lamport算法的时间戳原理 1.3 Lamport算法的5个原则 1.4 一个小栗子 2 算法实现 3 ...

最新文章

  1. 未来编程语言的发展方向(1)
  2. 【技术分享】如何解锁高通骁龙660上的安卓引导加载程序
  3. php错误以及常用笔记
  4. 索引 - 数据结构 - BTREE
  5. 主函数和子函数的传值传址例子
  6. vc6开发一个抓包软件_开发一个软件多少钱?3种软件开发公司报价
  7. c语言extern_【零基础C语言】- static和extern关键字 - 对变量的作用!
  8. Wireshark安装Npcap组件失败的解决方法
  9. 润乾报表如何固定表头
  10. 【论文学习】Cooling-Shrinking Attack: Blinding the Tracker with Imperceptible Noises论文学习
  11. Android使用BottomNavigationView+NavigationUI报错
  12. java 构造方法 继承_java-继承/构造方法?
  13. IT行业分析之嵌入式应用
  14. echarts方形柱状图
  15. 致敬经典:Ball and Brown (1968)
  16. 中美青年创客大赛启动,50万奖金等你来挑战!
  17. 呼和浩特民族学院计算机专业编号,2019呼和浩特民族学院专业排名
  18. 基于深度学习的图像增强综述
  19. SQLHelper助手类【代码】
  20. sql查询表中指定月份的数据

热门文章

  1. Ant Design Pro ProTable 自定义搜索菜单操作栏和搜索事件
  2. web前端-JavaScript流程控制语句(条件判断,条件分支和循环语句)
  3. 疫情期间,上海口碑比较好的月子会所分享
  4. 目标检测3--AnchorFree的FCOS
  5. scikit learn、tensorflow、keras区别
  6. embed 标签显示PDF, 并隐藏下载打印按钮
  7. android SeekBar
  8. gitlab-ce 备份还原 迁移新系统
  9. css去除选择器样式,CSS选择器样式排除一些选择
  10. offsetWidthoffsetLeft详解