回溯法——回溯法的算法思想
参考了一篇写的较好的博客
[回溯算法] 五大常用算法之回溯法_GoRustNeverStop的博客-CSDN博客_回溯算法
简单来说,回溯法是一个在所有可能性中寻找最优解的问题,但与遍历所有路径的全遍历不同的是:回溯法可能在中间的某一步产生了分支,我们在遍历路径的时候,可以选择从原来选择后的路径倒退回那个分叉路口,选择其他的分支。通过对各个分支的探索遍历完整个解空间,而不是每次都从起点开始遍历。比如经过了ABDH,我们也可以选择回溯去走ABDI,走完了D的两个分支我们还可以回到B分叉选择ABEJ。
就像玩多结局的文字游戏一样,我们在每个分支选项存档,如果想要体验其他分支不必重新开档从头开始,而是回到之前保存存档的那个分支去走其他选项。
递归回溯应该是最好理解的,它实际上就是对解空间的这颗树的深度优先遍历。f(n,t)中的f代表first,即分叉中第一个未经历的子树分支的起始编号,g(n,t)代表分叉中未经历过的子树分支的结束编号。我们对每一个分支都应当遍历,当到达叶子结点则输出。 而递归的调用应当是每层一个递归,若符合约束条件则进入下一层。Backtrack(t)中的t代表的就是树的深度(层次)。
迭代回溯是非递归的,不过仔细观察不难发现有一段代码和递归回溯是一模一样的。同样t仍然代表树深度,f(n,t)代表分叉中第一个未经历的子树分支的起始编号,g(n,t)代表分叉中未经历过的子树分支的结束编号。其实不难发现,迭代和递归的算法本质是一样的,只不过递归中算法嵌套,有分支就会进入下一层t++,内层递归结束回归外层t--。在迭代中则用while把这个过程表达了出来,迭代回溯同样也是深度优先算法。
子集树就是从有限的解空间里去寻找答案的集合,就是用我们平时的调用回溯法找出一个或多个解。解向量所需元素m往往比给出的元素数量n要小。
排序树就是n个元素需要按照一定的要求(性质)进行某种排序,其结果往往含有所有元素。它的树深度往往是n。
观察代码可以发现搜索排序树的回溯法就多了个Swap函数来排序结果,比如123是以1为分支的一个结果,遍历了123,132后,下一个有规律的结果就是将第一位的1和后面两位互换,也就是213与231,同理将第一位的1和3互换就是321和312。而且排序树每一次的分支选择都是建立在上一次经过其他分支的基础上的,所以这一层每一次互换都不会考虑上一层分支,所以i=t,比如1?是确定了第一个分支为1,接下来i=t=2,就考虑是123或者132。总而言之排序树是按照数的全排序的顺序来建立树的。
不难发现,其实回溯法的核心都是一样的算法,其本质都是对解空间构成树的深度优先遍历,子集树和排序树则属于不同的构建树的方法,但是回溯法的核心都是深度优先遍历。
回溯法——回溯法的算法思想相关推荐
- 【数据结构与算法】【算法思想】【联系与区别】回溯 贪心 动态规划 分治
4种算法思想比较与联系 如果将贪心,分治,回溯和动态规划四种算法思想分类,那贪心,回溯,动态规划可归为一类,而分治单独可以作为一类,因为它跟其他是三个都不大一样. 因为前三个算法解决问题的模型,都可以 ...
- 【算法思想:回溯法】回溯算法入门级详解
回溯法是一种非常重要的算法思想,在大厂面试中频繁出现,所以做了一个笔记,记录了一下. 回溯算法与深度优先遍历 以下是维基百科中「回溯算法」和「深度优先遍历」的定义. 回溯法 采用试错的思想,它尝试分步 ...
- 五大算法思想(三)回溯法及常见例子
文章目录 一.理论基础 1.1 基本策略 1.2 使用步骤 1.3 经典例子 二.常见例子 2.1 八皇后问题 2.2 装载问题 2.3 批量作业调度问题 2.4 背包问题 一.理论基础 回溯法作 ...
- 回溯法、分支限界法两种思想帮你轻松搞定旅行售货员问题(TSP)
问题描述 某售货员要到若干城市去推销商品,已知各城市之间的路线(或旅费).要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(或总旅费)最小.本文只考虑4个城市的情况,下面这个带权 ...
- 消消乐实验回溯法(深大算法实验3)报告+代码
实验代码 + 报告资源: 链接: https://pan.baidu.com/s/1CuuB07rRFh7vGQnGpud_vg 提取码: ccuq 目录 写在前面 实验要求 求解问题的算法原理描述 ...
- 【数据结构与算法】【算法思想】回溯算法
贪心算法 回溯算法 分治算法 动态规划 回溯算法思想应用广泛,除了用来指导深度优先搜索这种经典算法设计之外,还可以用在如正则表达式匹配,编译原理中的语法分析等. 除此之外,很多经典的数学问题都可以用回 ...
- 递归下降分析法的基本思想。_还不懂这八大算法思想,刷再多题也白搭!
各位朋友好久不见呢.最近由于刚入职,作为职场萌新,所以大部分时间都花在了工作上.因而也没有太多时间来写文章啦,这篇文章也是定题了许久,迟迟没有落笔.等之后工作慢慢稳定,业务熟练起来,文章更新频率就会高 ...
- [回溯法] 回溯法介绍-回溯与递归的区别
原文链接:https://www.yuque.com/cppdev/algo/loeps2 [回溯法] 有一类问题,我们不知道它明确的计算法则.而是先进行试探,试探到最终状况,发现不满足问题的要求,则 ...
- c语言动态规划回溯的原理,「算法思想」分治、动态规划、回溯、贪心一锅炖...
观感度:????? 口味:东北一锅出 烹饪时间:10min 本文已收录在Github github.com/Geekhyt,感谢Star. 数据结构与算法系列专栏第四弹来袭,往期专栏链接如下: 初学者 ...
最新文章
- 人是被经验塑造的动物,一家公司也是
- 2022年了我才发现Chrome原来可以直接生成二维码...
- C++ BYTE数组转字符串
- IFE JavaScript Task0002-1 小练习1:处理用户输入
- [J2ME]Nokia播放音乐时发生MediaException的解决办法
- Oracle大的存储层次体系,Oracle 数据库中的逻辑存储层次体系
- windows python3.7安装numpy问题的解决方法
- Linux—Centos 7.x安装Tomcat8
- 面试问题:SpringMVC的执行流程
- mysql json数组拆分表_MaxCompute将json数组拆分成多行
- LeetCode 15. 三数之和(3Sum)
- 怎么删除w7桌面计算机图标,w7桌面图标箭头怎么去掉?w7桌面图标箭头去掉方法...
- vue制作echart图表随着画面等比例放大缩小
- 摩托android one手机图片,Motorola One都说外观像iPhone,但实际却不一样!
- 为什么计算机连接u盘不显示内存不足,U盘明明有空间却提醒空间不足怎么解决...
- 将Windows10中的C盘desktop移到D盘
- LowMemoryKiller 的使用
- fpga驱动ad9854重大bug——已解决!
- 《Python编程:从入门到实践》第12章:武装飞船
- 第3-5课:24 点计算器
热门文章
- Csharp日常笔记
- Java HashSet和Java HashMap
- 谈yolov5车辆识别
- abp学习日志九(总结)
- 【学习】loss图和accuracy
- chrome插件莫名消失【已解决】
- IOException parsing XML document from class path resource [applicationContent.xml]; nested exception
- use case简介
- java英语句子_经典英语句子 (转) - HelloWorld 善战者,求之于势,不责于人;故能择人而任势。 - BlogJava...
- 解决surface的幽灵触控