DAY26:回溯算法(一):回溯算法理论

news2024/9/25 23:20:50

课程链接:https://www.bilibili.com/video/BV1cy4y167mM/?spm_id_from=333.788

什么是回溯法

回溯法 - OI Wiki (oi-wiki.org)

回溯法是一种经常被用在 深度优先搜索(DFS) 和 广度优先搜索(BFS) 的技巧。

其本质是:走不通就回头。

回溯和递归是相辅相成的,只要有递归,就会有回溯。回溯通常都是在递归函数的下面,递归函数下面的部分就是回溯的逻辑。

二叉树在递归的过程中都会有回溯的操作,只不过有的题目用到了回溯,有的题目没有用回溯。

回溯法的效率

回溯法其实是一个纯暴力的搜索,并不是什么高效的算法。用这种算法的原因,是因为有些问题能暴力搜出来已经很好了。用for循环一层一层嵌套的话,根本搜不出来。依靠回溯法才能把结果搜出来。最多再剪枝一下。

回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。

回溯法用来解决哪些问题?

1.组合问题

组合问题一般是给你一个集合,例如给出{1,2,3,4},要求在这个集合里找出大小为2的组合。这种组合包括{1,2}{1,3}{1,4}{2,3}{2,4}{3,4}。找出这些组合,就是一个组合问题

也就是N个数里面按一定规则找出k个数的集合

2.切割问题

切割问题通常是给一个字符串,问字符串有几种切割的方式

或者再加限制条件,比如给你一个字符串,如何保证其子串都是回文子串

也就是一个字符串按一定规则有几种切割方式

3.子集问题

我们继续用{1,2,3,4}来举例,1是子集,2是子集,1 3是子集,1 4也是子集……把它的子集全部列出来,就是子集问题

这种问题用for循环嵌套其实是很困难的。

也就是一个N个数的集合里有多少符合条件的子集

3.排列问题

排列和组合的区别:组合是强调没有顺序的,但排列不是

如果集合是{1,2},只有一种组合,但是有两种排列,分别是{1,2}和{2,1}。排列强调元素的顺序,组合不强调元素顺序。

示例问题就是N个数按一定规则全排列,有几种排列方式

4.棋盘问题

包括N皇后,解数独,这些都是棋盘问题。这种问题用for也很难解决,必须用回溯搜索法

如何理解回溯法?

回溯法是比较抽象的,如果想要更清晰的思路,可以将回溯法抽象成图形结构。只是脑内模拟会非常困难。

所有的回溯法都可以抽象为一个树形结构。所有回溯法都可以进行抽象。

因为回溯就是一个递归的过程,递归一定是有终止的。回溯法通常可以抽象为一个N叉树,如下图所示。

树的宽度就是我们在回溯法中处理的集合大小,也就是每个节点所处理的集合大小

宽度上,我们通常是用for循环来进行遍历的。
在这里插入图片描述
树的深度,就是递归的深度。因为递归一定是有终止的,纵方向上,就是递归来处理的。

回溯的所有问题,都可以抽象成这种树形结构

更具体的版本:

在这里插入图片描述
注意图中,特意举例集合大小和孩子的数量是相等的

回溯法的模板

一般来说,回溯法的递归函数都是没有返回值的,就是void。递归函数一般起名叫做backtracking.

参数上,回溯法的参数一般都是比较多的不太容易一开始的时候就确定下来所有参数

void backtracking(参数){
    //终止条件,递归一定有终止
    if(终止条件){
        //终止条件一般就是收集结果的时候,结果一般都在叶子节点
        //只有子集问题是在每一个节点都要收集
        收集结果;
        return;//不能忘记return
    }
    
    //单层搜索的逻辑,单层搜索一般是一个for循环,for遍历集合里的每一个元素
    //也可以对应这个节点所有的子节点个数
    for(选择:本层集合中元素(树中节点孩子的数量就是集合的大小)){
        //遍历每一个元素
        处理节点;例如把结果{12}放到一个数组里;
        //进入递归过程
         backtracking(路径,选择列表); 树形图里面一层一层往下走;
        //回溯
        回溯操作;撤销处理这个节点的情况;
        	例如找{1,2}之后,要把2弹出去重新变成1,再加入3
    }
    return;    
}

回溯法解决的问题都可以抽象为树形结构(N叉树)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/657370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch 基本使用(一)写入数据

写入数据 查询索引状态写入一条数据查询数据按id查询一条 类比 getById不按id查 写入官方测试数据 查询索引状态 GET _cat/indices写入一条数据 PUT/POST my_index/_doc/1 {"k": "test key" }my_index:索引名 _doc:文档类型&#…

css基础知识三:说说em/px/rem/vh/vw的区别?

一、介绍 传统的项目开发中,我们只会用到px、%、em这几个单位,它可以适用于大部分的项目开发,且拥有比较良好的兼容性 从CSS3开始,浏览器对计量单位的支持又提升到了另外一个境界,新增了rem、vh、vw、vm等一些新的计量…

2023年网络安全竞赛——网页渗透

网页渗透 任务环境说明:  服务器场景:Server2120  服务器场景操作系统:未知(封闭靶机)  用户名:未知 密码:未知 访问服务器的网站主页,猜测后台数据库中本网页中应用的库名称长度,将长度作为flag提交; 通过扫描发现靶机开放80端口,直接访问80 尝试输入一个1,…

Web安全信息收集之CMS指纹识别

1、CMS指纹识别 CMS(内容管理系统),又称整站系统或文章系统网站内容管理。用户只需要下载对应的CMS软 件包,部署搭建,就可以直接利用CMS,简单方便。但是各种CMS都具有其独特的结构命名规则和定 的文件内容,因此可以利用这些内容来获取CMS站点的具体软件CMS与版本 常见CMs: …

软件管理Linux

1. 获取程序包的途径 系统发行版的光盘或官方的服务器 http://mirrors.aliyun.comhttp://mirrors.sohu.comhttp://mirrors.163.com 项目官方站点第三方组织 Fedora-EPEL(推荐)搜索引擎: http://pkgs.org http://rpmfind.net http://rpm.pbon…

数据库第十章(数据库恢复技术)十一章(并发控制)

目录 1.事务 2.并发控制 1.事务 事务的特点:ACID 原子性 atom 一致性 consistent 隔离性 isolation 持久性 durable 故障的种类 1.事务内部故障 措施:采取redo重做和undo撤销技术 2.系统故障DBMS 措施:重启 3.介质故障 硬件损坏 4.计…

msvcr110.dll丢失的解决方法-dll一键下载修复

我们在运行软件程序或者游戏的时候,如果程序提示“无法启动此程序,因为计算机中丢失msvcr110.dll。尝试重新安装该程序以解决此问题”,如果说明您电脑系统中缺少或者未注册msvcr110.dll这个运行库文件,那么我们要如何解决这个问题…

大学生简历信息填写模板

大学生简历信息填写模板篇1 姓名:__性别:_年龄:22健康状况:良好 籍贯:__家庭背景:职工家庭 所学专业:市场营销学历:本科(在读) 参业意向:可从事文秘工作、贸易、产品营销…

pytorch神经网络及训练(一)

pytorch神经网络及训练(一) 随机梯度下降算法 随机梯度下降算法(SGD)是对梯度下降算法的一种改进。 直观上SG的方法可能效率上更优。考虑这样一个情况,我们的训练数据集合 是由小的数据 集合复制10份得到的。此时&…

Java代码规范的重要性

目录 1 为什么需要代码规范1.1 不规范的案例1.1.1 就因为忘记加个分号,整个程序都崩溃了1.1.2 我为什么没写注释?1.1.3 谁动了我的代码?1.1.4 半小时写的代码,花两个小时调试 1.2 代码编写1.3 在项目架构1.4 数据库设计1.5 编写文…

openpnp - 软件版本的更新记录(机器翻译)

文章目录 openpnp - 软件版本的更新记录(机器翻译)概述openpnp更新历史记录机翻了一个版本, 大概齐参考一下.END openpnp - 软件版本的更新记录(机器翻译) 概述 卡在底部相机矫正上, 底部相机的硬件安装已经很精确了, 基本能排除是硬件问题. 现在问题定位, 大概率是openpnp软…

g++ -v 若显示g++不是内部或外部命令`

MinGW - Minimalist GNU for Windows Files下载地址 下载地址点这里https://sourceforge.net/projects/mingw/files/ . exe文件下载后建议安装在D盘下tools文件夹下(个人习惯) 此次安装在默认路径下,直接傻瓜式安装 安装: 1.…

2023年网络安全竞赛——网络安全应急响应Server2228

网络安全应急响应 任务环境说明: 服务器场景:Server2228(开放链接) 用户名:root,密码:pssw0rd123 1. 找出被黑客修改的系统别名,并将倒数第二个别名作为Flag值提交&#xff1b…

CTFshow-pwn入门-前置基础pwn13-pwn19

pwn13 题目说编译运行这个flag.c文件即可获得flag。那我们先把flag.c文件下载下来,然后托到虚拟机里使用gcc编译一下,运行看看是否能够拿到flag。 gcc -o flag -flag.c ./flagok,果然拿到了flag。flag为:ctfshow{hOw_t0_us3_GCC?…

前端小练-平台首页介绍+动画

文章目录 前言结构头部外部容器文字 主体小球动画打字机动画特效实现监控 完整代码总结 前言 时间飞逝,快大四了,刚好最近看不下去考研的,而且要准备这个毕设选题了,然后就想着怎么能够把自己所学的东西都用上,一开始…

Vue H5项目如何在PC端时布局居中展示,而不全屏拉伸

目录 1、场景再现:在PC端时 H5项目布局被拉伸2、代码实现3、最终效果图4、疑惑 1、场景再现:在PC端时 H5项目布局被拉伸 2、代码实现 在App.vue中的写入,vue2 的在mounted中写入,vue3的写在onMounted写入。 逻辑讲解&#xff1a…

Android 全局黑白化-模拟颜色空间

概述 平台: RK3568 Android 11在一些特殊的日子,如默哀日、灾难日,纪念日,哀悼日等,许多的APP、网页、海报等都开始使用黑白色主题。Android 的全局黑白实现方案,可以考虑使用模拟颜色空间的方法。 借助硬…

RabbitMQ高阶使用消息推送

目录 1 从打车开始说起1.1 需要解决的问题1.2 消息推送 2 消息推送2.1 什么是消息推送2.2 方案介绍2.2.1 ajax短轮询2.2.2 长轮询2.2.3 WebSocket 2.3 WS实现消息推送2.3.1 架构介绍2.3.2 暂存数据2.3.2.1 什么是MongoDB2.3.2.2 插入数据2.3.2.3 查询数据 2.4.1 轮询任务2.4.1.…

学生党暑假在家赚钱得方法,足不出户轻松赚取买鞋钱

很多学生党都想在暑假期间赚点零花钱,最好是能在家就赚钱。在家里赚零花钱有许多途径,今天我来和大家分享一些方法。 1、问答在各大平台上非常普遍。 我们可以在各大平台上找到各种各样的问答。 如今,问答平台越来越多,提供的奖…

平凯星辰重磅支持 2023 开放原子全球开源峰会,开源数据库分论坛成功召开

2023 年 6 月 11 日至 13 日,以“开源赋能,普惠未来”为主题的 2023 开放原子全球开源峰会开幕式暨高峰论坛在北京成功举办。企业级开源分布式数据库厂商平凯星辰联合创始人兼 CTO 黄东旭受邀出席峰会参与开源论道圆桌,担任开源数据库分论坛出…