【算法】回溯法

article/2025/7/5 4:30:37

一、回溯法的基本思想

  1. 回溯法有“通用解题方法”的美称,解题过程是一个搜索过程。在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回(也就是递归返回),尝试别的路径。因此,回溯法是一种能避免不必要搜索的穷举式搜索法,通常可以用递归来实现。许多复杂的、规模较大的问题都可以使用回溯法。
  2. 回溯法是一个既带有系统性又带有跳跃性的搜索算法。
  3. 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。

二、案例

2.1 四后问题(n后问题的一个实例)

**【问题描述】**在4 ×4 的方格棋盘上放置4个皇后,使得没有两个皇后在同一行、同一列、也不在同一条45度的斜线上(彼此不攻击)。问有多少种可能的布局?
在这里插入图片描述
4后问题的可行解是:{2,4,1,3}和{3,1,4,2}

在这里插入图片描述
搜索空间:4叉树(每个结点有4个儿子)

  1. 每个结点的4个儿子分别代表选择1,2,3,4列位置
  2. 第i层选择向量中第i个分量的值
  3. 最深层的树叶就是解
  4. 按深度优先次序遍历,找到所有解

下图是4问题的搜索空间,图中每个状态由当前放置的皇后的行列号构成。它给出了4后问题的全部搜索过程,只有18个结点,其中标有 x 号的结点无法继续扩展。
在这里插入图片描述

2.2 0-1背包问题

**【问题描述】**给定n种物品和一背包,每种物品只有1个且不能分割。物品i的重量是wi,其价值为vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大。

实例:V={12, 11, 9, 8},W={8, 6, 4, 3},C=13
最优解:{0, 1, 1, 1},总价值28,总重量13

搜索空间:0-1取值的二叉树(称为子集树
子集树:当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。

遍历子集树需O(2n)计算时间
在这里插入图片描述

2.3 旅行商问题

**【问题描述】**有n个城市,已知任意两个城市之间的距离,求一条每个城市恰好经过一次的回路,使得总长度最小。
搜索空间:排列树(有(n-1)!个叶子节点)
排列树:当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树。

遍历排列树需要O(n!)计算时间
在这里插入图片描述

2.4 回溯法示例总结

问题的解:都是向量形式
搜索空间:树,可能是n叉树、子集树、排列树等,树的结点对应于部分向量,可行解在叶结点
搜索方法:深度优先,跳跃式遍历搜索树,找到可行解或最优解

适用:求解搜索问题和优化问题
搜索空间:树,结点对应部分解向量,可行解在树叶上
搜索过程:采用系统的方法隐含遍历搜索树
搜索策略:深度优先
结点分支判定条件
满足约束条件,分支扩张解向量
不满足约束条件,回溯到该结点的父结点
结点状态:动态生成
存储:当前路径

三、回溯法中的概念

3.1 结点状态

扩展结点:一个正在产生儿子的结点称为扩展结点
活结点:一个自身已生成但其儿子还没有全部生成的节点称做活结点
死结点:一个所有儿子已经产生的结点称做死结点
在这里插入图片描述
深度优先访问次序
1 -> 2 -> 3 -> 5 -> 8 -> 9 -> 7 -> 4

广度优先访问次序
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9

3.2 生成问题状态的基本方法

  1. 深度优先的问题状态生成法:如果对一个扩展结点R,一旦产生了它的一个儿子C,就把C当做新的扩展结点。在完成对子树C(以C为根的子树)的穷尽搜索之后,将R重新变成扩展结点,继续生成R的下一个儿子(如果存在)。
  2. 广度优先的问题状态生成法:在一个扩展结点变成死结点之前,它一直是扩展结点

3.3 避免无效搜索的策略 剪枝函数

回溯法搜索解空间树时,通常采用两种策略避免无效搜索,提高搜索效率

  1. 用约束函数在扩展结点处剪去不满足约束的子树
  2. 用限界函数(bounding function)剪去得不到最优解的子树

约束函数和限界函数统称为剪枝函数。

为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。具有限界函数的深度优先生成法称为回溯法(与分支限界法相对应)。

3.4 回溯法解题通常包含以下3个步骤

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

用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n))。而显式地存储整个解空间则需要O(2h(n))或O(h(n)!)内存空间。

四、 回溯法与深度优先遍历的异同

相同点
回溯法在实现上也是遵循深度优先的,即一步一步往前探索。

不同点

  1. 访问序不同:深度优先遍历目的是“遍历”,本质是无序的。而回溯法目的是“求解过程”,本质是有序的。
  2. 访问次数的不同:深度优先遍历对已经访问过的顶点不再访问,所有顶点仅访问一次。而回溯法中已经访问过的顶点可能再次访问。
  3. 剪枝的不同:深度优先遍历不含剪枝,而很多回溯算法采用剪枝条件剪除不必要的分枝以提高效能。

五、示例

5.1 装载问题

**【问题描述】**有一批总重为W的共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且 W ≤c1+c2。
要求确定是否有一个合理的装载方案可将这些集装箱装上这2艘轮船。如果有,找出一种装载方案。

将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近。此问题等价于以下特殊的0-1背包问题。

在这里插入图片描述
回溯法求解伪代码

void backtrack (int i)
{if (i > n) // 到达叶结点更新最优解bestx,bestw;return;r - = w[i];if (cw + w[i] <= c1) {// 搜索左子树x[i] = 1;cw + = w[i];backtrack(i + 1);cw - = w[i]; }if (cw + r > bestw) {x[i] = 0; // 搜索右子树backtrack(i + 1); }r += w[i];
}

5.2 符号三角形问题

下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。
在这里插入图片描述
在一般情况下,符号三角形的第一行有n个符号。
**【问题描述】**符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。

符号三角形问题相应的解空间是一棵完全二叉树

解向量:用n元组x[1:n]表示符号三角形的第一行,可用一棵完全二叉树表示其解空间。 当第1行前i个符号确定后,就确定了一个由n*(n+1)/2个符号组成的符号三角形。
可行性约束函数:当前符号三角形所包含的“+”个数与“-”个数均不超过n*(n+1)/4
无解的判断:n*(n+1)/2为奇数

回溯法求解伪码

void backtrack (int t)
{if ((count>half)||(t*(t-1)/2-count>half)) return;if (t>n) sum++;else for (int i=0;i<2;i++) {p[1][t]=i;count+=i;for (int j=2;j<=t;j++) {p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2];count+=p[j][t-j+1];}backtrack(t+1);for (int j=2;j<=t;j++) count-=p[j][t-j+1];count-=i;}
}

六、回溯法效率分析

通过前面具体实例的讨论容易看出,回溯算法的效率在很大程度上依赖于以
下因素:
(1) 产生x[k]的时间;
(2) 满足显约束的x[k]值的个数;
(3) 计算约束函数constraint的时间;
(4) 计算界限函数bound的时间;
(5) 满足约束函数和界限函数约束的所有x[k]的个数。

好的约束函数能显著地减少所生成的结点数。但这样的约束函数往往计算量较大。因此,在选择约束函数时通常存在生成结点数与约束函数计算量之间的折中。

七、重排原理

对于许多问题而言,在搜索试探时选取x[i]的值顺序是任意的。在其他条件相当的前提下,让可取值最少的x[i]优先。从图中关于同一问题的2棵不同解空间树,可以体会到这种策略的潜力。

在这里插入图片描述
图(a)
在这里插入图片描述
图(b)

  1. 图(a)中,从第1层剪去1棵子树,则从所有应当考虑的3元组中一次消去12个3元组。
  2. 对于图(b),虽然同样从第1层剪去1棵子树,却只从应当考虑的3元组中消去8个3元组。
  3. 前者的效果明显比后者好。

八、小结

(1) 适于求解组合搜索问题及优化问题
(2) 解的表示:解向量,求解是不断扩充解向量的过程
(3) 回溯条件:
搜索问题——约束条件
优化问题——约束条件+ 限界函数(代价函数)
(4) 分支策略:深度优先
(5) 结点状态:死结点、活结点、扩展结点
(6) 算法时间复杂度:
W(n) = ( p(n) f(n) )
其中p(n) 为每个结点的工作量, f(n)为结点个数

最坏情况下时间通常为指数级
平均情况下比蛮力算法好
空间代价小

降低时间复杂性的主要途径

  1. 根据树的分支设计优先策略
  2. 结点少分支优先
  3. 解多分支优先
  4. 利用搜索树的对称性裁减子树
  5. 分解为子问题,利用分治策略求解

http://www.hkcw.cn/article/XxoinTlXWQ.shtml

相关文章

AIGC 基础篇 高等数学篇 01函数与极限

声明&#xff1a;本文章仅用于博主本人复习&#xff0c;请不要将本文章当成预习篇或者讲解篇 此外&#xff0c;此文章不会包含全部的高等数学知识&#xff0c;仅仅是为了学习AI而进行的前期学习&#xff0c;因此知识含量不会很多&#xff0c;由于博主是第一次尝试做&#xff0…

如何在 Windows 11 Home 版上下载和安装 Hyper-V

Windows 11 Home 版与之前的微软操作系统版本一样,没有自带 Hyper-V 管理器。因此,如果您想在 Windows 11 Home 上下载和安装 Hyper-V,以下是详细的步骤教程。 Hyper-V 是微软提供的一种虚拟化解决方案,允许用户为各种操作系统创建虚拟机。与 VMware 或 VirtualBox 不同,…

C++ --- string类的简单实现

string类的简单实现 前言1、基本成员2、构造方法和析构方法2.1无参构造2.2有参构造2.3析构函数2.4拷贝构造函数 3、遍历方式3.1operator [ ]3.2iterator3.2.1正向迭代器3.2.2const正向迭代器 3.3范围for 4、常用方法&#xff0c;运算符重载c_str()size()reverse()push_back()po…

ESP32之Linux编译环境搭建流程

背景&#xff1a;为了解决 “windows环境中编译ESP32代码速度慢” 的问题&#xff0c;现搭建一个Linux环境&#xff0c;让windows下的VScode连接到Linux环境&#xff0c;VSCode负责编辑代码&#xff0c;虚拟机用于编译代码。 目录 一、安装VMware 1.1 获取VMware安装包 1.2…

Python-matplotlib中的Pyplot API和面向对象 API

matplotlib中的Pyplot API和面向对象 API Pyplot API&#xff08;状态机模式&#xff09;面向对象 API 详解二者差别核心区别方法命名差异注意事项差别举例 &#x1f345; Pyplot API&#xff08;状态机模式&#xff09;和面向对象 API 是两种不同的编程接口.&#x1f345; 它们…

BUUCTF之[ACTF2020 新生赛]BackupFile

打开环境就一句话 找出源文件! 结合题目名字&#xff1a;BackupFile 先用dirsearct扫描网站文件 发现一个index.php.bak ,拼接url下载 打开发现php代码 <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key];if(!is_numeric($key)) {exit…

Spring Boot 3.X 下Redis缓存的尝试(一):初步尝试

背景 想像一下有这么一个场景&#xff0c;一个系统有超多角色、角色下有多个菜单、菜单下有多个按钮权限&#xff0c;这种子父级关系查询每次向数据库查询相当耗时&#xff0c;那么我们是否可以将这种更新频次不高&#xff0c;而查询耗时的数据且不直接影响业务的数据放进缓存中…

基于springboot的民间文化艺术品销售系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

9 动态规划

9.3 爬楼梯 从1开始举例子发现规律 dp[i]dp[i-1]dp[i-2]; class Solution { public:int climbStairs(int n) {if(n<1){return 1;}vector<int>dp(n1);dp[2]2;dp[1]1;for(int i3;i<n;i){dp[i]dp[i-1]dp[i-2];}return dp[n];} }; 9.29 打家劫舍 1 确定dp数组下标与…

Playwright 测试框架 - Node.js

🚀超全实战:基于 Playwright + Node.js 的自动化测试项目教程【附源码】 📌 本文适合自动化测试入门者 & 前端测试实战者。从零开始手把手教你搭建一个 Playwright + Node.js 项目,涵盖配置、测试用例编写、运行与调试、报告生成以及实用进阶技巧。建议收藏!👍 �…

4.RV1126-OPENCV 图像轮廓识别

一.图像识别API 1.图像识别作用 它常用于视觉任务、目标检测、图像分割等等。在 OPENCV 中通常使用 Canny 函数、findContours 函数、drawContours 函数结合在一起去做轮廓的形检测。 2.常用的API findContours 函数&#xff1a;用于寻找图片的轮廓&#xff0c;并把所有的数…

Cursor从入门到精通实战指南(五):一键生成流程图/架构图,开发者必备收藏!

解锁Cursor&#xff1a;开启高效开发新境界 结合了GPT-4、Claude 3.5等强大的大语言模型&#xff0c;能够通过自然语言交互实现代码生成、原型设计、流程优化等功能。无论是编程新手还是经验丰富的开发者&#xff0c;都能借助Cursor的智能特性&#xff0c;快速完成复杂的编码任…

postman工具使用

基本功能操作 常用断言 定义&#xff1a;postman 断言借助 JavaScript - js 语言编写代码&#xff0c;自动判断预期结果与实际结果是否一致。&#xff08; 注意断言 代码写在 Tests 的标签中&#xff09; 断言响应状态码 断言响应体是否包含某个字符串&#xff08;Response bo…

【Elasticsearch】Elasticsearch 核心技术(一):索引

Elasticsearch 核心技术&#xff08;一&#xff09;&#xff1a;索引 1.索引的定义2.索引的命名规范3.索引的增、删、改、查3.1 创建索引3.1.1 创建空索引 3.2 删除索引3.3 文档操作3.3.1 添加/更新文档&#xff08;指定ID&#xff09;3.3.2 添加文档&#xff08;自动生成ID&am…

玩客云 OEC/OECT 笔记(2) 运行RKNN程序

目录 玩客云 OEC/OECT 笔记(1) 拆机刷入Armbian固件玩客云 OEC/OECT 笔记(2) 运行RKNN程序 RKNN OEC/OEC-Turbo 使用的芯片是 RK3566/RK3568, 这个系列是内建神经网络处理器 NPU 的, 利用 RKNN 可以部署运行 AI 模型利用 NPU 硬件加速模型推理. 要使用 NPU, 首先需要在电脑使…

【音视频】FFmpeg 硬件(NVDIA)编码H264

FFmpeg 与x264的关系 ffmpeg软编码是使⽤x264开源项⽬&#xff0c;也就是说ffmpeg软编码H264最终是调⽤了x264开源项⽬&#xff0c;所以我们要先理解ffmpeg和x264的调⽤关系&#xff0c;这⾥我们主要关注x264_init。对于x264的参数都在 ffmpeg\libavcodec \libx264.c x264\co…

深度学习和神经网络 卷积神经网络CNN

1.什么是卷积神经网络 一种前馈神经网络&#xff1b;受生物学感受野的机制提出专门处理网格结构数据的深度学习模型 核心特点&#xff1a;通过卷积操作自动提取空间局部特征&#xff08;如纹理、边缘&#xff09;&#xff0c;显著降低参数量 2.CNN的三个结构特征 局部连接&a…

论文略读:LIMO: Less is More for Reasoning

202502 arxiv 在数学推理领域&#xff0c;论文提出的LIMO仅用 817 条精心设计的训练样本&#xff0c;借助简单的监督微调&#xff0c;就全面超越了使用十万量级数据训练的主流模型 最近的大模型在预训练阶段已纳入海量数学知识&#xff08;比如Llama 3 仅在数学推理上的训练数…

web架构3------(nginx的return跳转,gzip压缩,目录浏览,访问控制和location符号优先级)

一.前言 本期继续来介绍nginx的各项配置&#xff0c;看着内容很多&#xff0c;但是主要还是介绍&#xff0c;内容还是很少的。 二.return和rewrite跳转 在我们配置ssl证书之后&#xff0c;如果把https的s去掉&#xff0c;就相当于去访问80端口了&#xff0c;https默认找的是…

大楼智能化建设设计方案(Word)

第一章 智能化设计 4 1.1 项目概况 4 1.2 设计原则 4 1.3 设计依据 6 1.4 项目总体规划 7 1.5 综合布线系统 8 1.5.1 综合布线系统 8 1.5.2 楼宇分机房系统 20 1.5.3 有线电视网 27 1.6 建筑智能化系统 37 1.6.1 周界防范系统 37 1.6.2 电子巡更系统 38 1.6.3…