回溯算法思想、回溯算法解题模板与回溯算法题目索引(不断更新)

回溯算法

  • 回溯算法是一种试探性的搜索算法,它在解决某些组合问题、优化问题、路径问题等,非常有效。回溯算法的核心思想是通过递归和深度优先搜索(DFS)来搜索问题的解空间

  • 细说一下这些问题:
    组合问题:N个数里面按一定规则找出k个数的集合
    切割问题:一个字符串按一定规则有几种切割方式
    子集问题:一个N个数的集合里有多少符合条件的子集
    排列问题:N个数按一定规则全排列,有几种排列方式
    棋盘问题:N皇后,解数独等等

回溯算法的主要步骤如下:

  1. 定义问题的解空间:首先要确定问题的解空间,它通常是一个树形结构,其中每个节点表示一个局部解或部分解。

  2. 深度优先搜索:从根节点开始,沿着深度方向逐个搜索节点。每次递归时,都会传递当前的解或部分解。

  3. 试探与回溯:当搜索到某个节点时,首先检查该节点是否满足问题的约束条件。如果满足,就继续向下搜索;如果不满足,就回溯到上一个节点,尝试其他可能的选择。这就是所谓的“试探与回溯”。

  4. 记录解或剪枝:在搜索过程中,当找到一个可行解或者达到搜索的最大深度时,需要记录这个解。在某些情况下,还可以通过剪枝(例如,剪去不可能产生更优解的子树)来加速搜索过程。

  5. 重复以上步骤,直到搜索完整个解空间或满足停止条件。

回溯算法的优缺点:

  • 优点:
    适用范围广泛:回溯算法适用于解决许多组合问题和优化问题,如八皇后问题、旅行商问题、图着色问题等。
    容易理解和实现:回溯算法的逻辑较为简单,容易理解和实现。

  • 缺点:
    效率可能较低:回溯算法可能需要遍历整个解空间,当解空间很大时,算法的效率可能较低。
    剪枝策略依赖于问题:在某些情况下,可以通过剪枝来加速搜索过程,但剪枝策略通常依赖于问题的特点,可能需要针对不同问题进行调整。

总之,回溯算法是一种通用、易理解的搜索算法,可以有效解决许多组合问题和优化问题。但需要注意,在解空间较大时,可能需要使用剪枝等手段提高搜索效率。

回溯算法解题模版

  • 这里借用我最崇拜的Carl哥总结的回溯算法模板。

回溯算法解题三部曲:

第一步,找出回溯函数模板返回值以及参数

  • 在回溯算法中,我的习惯是函数起名字为backtracking,这个起名大家随意。

  • 回溯算法中函数返回值一般为void。

  • 再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。

  • 回溯函数伪代码如下:

    void backtracking(参数)
    

第二步,确定回溯函数终止条件

  • 既然是树形结构,就知道遍历树形结构一定要有终止条件,所以回溯也有要终止条件。

  • 什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。

  • 所以回溯函数终止条件伪代码如下:

    if (终止条件) {
    	存放结果;
     return;
    }
    

第三步,回溯搜索的遍历过程

  • 在上面我们提到了,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。

  • 如图:
    在这里插入图片描述

  • 注意图中,我特意举例集合大小和孩子的数量是相等的!

  • 回溯函数遍历过程伪代码如下:

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
    	处理节点;
    	backtracking(路径,选择列表); // 递归
    	回溯,撤销处理结果
    }
    
  • for循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。

  • backtracking这里自己调用自己,实现递归。

  • 大家可以从图中看出for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历,这样就把这棵树全遍历完了,一般来说,搜索叶子节点就是找的其中一个结果了。

  • 分析完过程,回溯算法模板框架如下:

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

这份模板很重要,后面做回溯法的题目都靠它了!

回溯算法题目索引

  • 《程序员面试金典(第六版)》面试题 08.02. 迷路的机器人(路径问题)
  • 《程序员面试金典(第6版)》面试题 08.04. 幂集(子集问题)
  • 《程序员面试金典(第6版)》面试题 08.07. 无重复字符串的排列组合(全排列问题)
  • 《程序员面试金典(第6版)》面试题 08.08. 有重复字符串的排列组合(全排列问题)
  • 《程序员面试金典(第6版)》面试题 08.09. 括号(特殊的排列问题)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初级网络工程师这30道面试题一定得会,建议小白收藏!

你好,这里是网络技术联盟站。 后台有小伙伴想让瑞哥整理一下初级网络工程师面试题,今天我整理出来了,针对初级网络工程师,我们在面试的时候主要考察的是基础概念,下面列举的希望大家可以收藏,平时多看看&a…

活动选择问题 | 贪心算法 1

贪心法是一种算法范式,它逐个构建解决方案,始终选择下一个提供最明显和最直接好处的部分。贪心算法用于优化问题。 如果问题具有以下属性,则可以使用 Greedy 解决优化问题: 在每一步中,我们都可以做出当前看起来最好…

MongoDB 6.0 (四)聚合操作

一、 聚合框架的作用 1. 什么是MongoDB 聚合框架 MongoDB 聚合框架(Aggregation Framework)是一个计算框架,它可以: • 作用在一个或几个集合上; • 对集合中的数据进行的一系列运算; • 将这些数据转化为期望的形式; 从效果而言,聚合框架相当于SQL 查询中的: …

【Mysql系列】——详细剖析数据库“索引”【上篇】

【Mysql系列】——详细剖析数据库中的核心知识【索引】😎前言🙌索引索引概述为什么需要索引?索引的优缺点索引结构索引的结构为什么不是二叉树和红黑树?索引的B树结构索引的Hash结构Hash结构索引的特点思考:为什么Inno…

MySQL中多表查询(多表关系:一对多、多对多、一对一,分类:连接查询:内连接、外连接、自连接、联合查询,子查询:标量子查询、列子查询、行子查询、表子查询)

多表关系: 一对多: 多对多: 一对一: 我们发现我们利用DQL中的select语句查询多张表的时候,会出现一个数学现象,叫做笛卡尔积 因此我们可以加上where语句来限定条件: 内连接: 此处in…

计算机网络面试八股文攻略(一) —— OSI 七层模型

一、简述 本系列将对面试中与计算机网络相关的知识进行讲解与分析。 本篇为 OSI 七层网络模型的相关知识。 二、概念 OSI 七层网络模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。它是一个七层的、抽象的模型体&#xff…

A Causal Debiasing Framework for Unsupervised Salient Object Detection

背景知识 显著性检测 简单就是使用图像处理技术和计算机视觉算法来定位图片中最“显著”的区域。显著区域就是指图片中引人注目的区域或比较重要的区域,例如人眼在观看一幅图片时会首先关注的区域。 chatGPT4的回答 计算机视觉中的显著性检测(Visual…

从事6个月软件测试,目前只会功能测试迷茫了...

前言 (来自一位粉丝的投稿)来这个公司大半年,现在主要做的是类似于淘宝的购物商城,以前也做应用系统什么的,可是感觉公司的软件测试岗位都是不着边的,因为做的都是功能测试,来了这么久,没接触过技术性的东…

美丽苏大,清华博士,年轻硕导,招收研究生了!

Datawhale学术 导师:张正超,苏州大学,Datawhale成员导师信息本人于2022年取得清华大学博士学位,目前是苏州大学计算机科学与技术学院的硕士生导师,2023年可招收计算机科学与技术、软件工程、人工智能及大数据技术与工程…

微服务保护Sentinel一站式学习

微服务保护Sentinel 雪崩问题 解决雪崩问题的四种常见方式: 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。如果设置一秒钟没响应返回,即1s释放连接,这1s中有好多个请求…

BOSS直拒、失联招聘,消失的“金三银四”,失业的测试人出路在哪里?

裁员潮涌,经济严冬。最近很多测试人过得并不好,行业缩水对测试岗位影响很直接干脆,究其原因还是测试门槛在IT行业较低,同质化测试人员比较多。但实际上成为一位好测试却有着较高的门槛,一名优秀的测试应当对产品的深层…

Stable Diffusion 视频和图片帧互换以及AI动画帧生成

Stable Diffusion 只做AI动画是基于把原有视频按照帧进行提取之后对每一帧的图像进行标准化流程操作,中间可以掺杂Controlnet对人物进行控制,使用关键词对画面进行控制,但是很多小伙伴不太会掌握一些编辑视频软件或者python的操作导致视频转帧…

Java 深入理解Servlet

动态资源与静态资源区别 servlet三及相关接口简介servet 执行过程servlet路径映射servlet生命周期(重点) --理解(重点)Servlet自动加载Servlet线程安全Servlet相关接口详解ServletContext对象 --知识点 一、Web项目结构 |- WebRoot : web应用的根目录…

【linux】常用命令大全(入门必备)

这篇文章涵盖了linux中常用的所有指令,欢迎大家阅读查询。(如有不正确的地方,各位大佬可以在评论区指出,我会及时进行更正)。 文章目录登录远程服务器ssh添加删除用户当前路径pwd列出文件目录ls进入cdtreewhoami创建文件touch创建目录mkdir删…

【C语言学习】循环结构和选择结构

C语言中有三大结构,分别是顺序结构、选择结构和循环结构(分支结构): C语言顺序结构就是让程序按照从头到尾的顺序依次执行每一条C语言代码,不重复执行任何代码,也不跳过任何代码。 C语言选择结构也称分支结…

都说IT行业饱和了,2023年成为程序员还有发展前景吗?

程序员饱和了吗?初级码农肯定是算饱和了,因为大部分的互联网企业开始提高招聘要求了,比如技能要求、两三年工作经验、项目经验、软实力等,是按照中级开发人员的标准来的。所以干程序员还是有发展前景的,你的技能达标了…

Linux常用命令——locate命令

在线Linux命令查询工具 locate 比 find 好用的文件查找工具 补充说明 locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案…

虹科喜报 | 虹科技术工程师【国内首批】拿下Redis认证开发者证书!

要说虹科数据库技术工程师有多强悍,认证考试2022年12月上线,次年2月就以全国首批速度强势通过考试,并于两周后正式收到【Redis认证开发人员】证书! 虹科小云忍不住浅浅炫耀一下: 或许大家对Redis企业版数据库认证开发…

前端面试题之html css篇

文章目录1.什么是盒模型2.行内元素有哪些&#xff1f;块级元素有哪些&#xff1f; 空(void)元素有那些&#xff1f;行内元素和块级元素有什么区别&#xff1f;3.简述src和href的区别4.什么是css Hack5.什么叫优雅降级和渐进增强6.px和em的区别7.HTML5 为什么只写< !DOCTYPE …

[linux虚拟机]网络连接的三种模式和重要文件夹

桥接模式: 虚拟系统可以和外部系统通讯,但容易造成IP冲突NAT模式,网络地址转换模式,虚拟系统可以和外部系统通讯,不造成IP冲突主机模式:独立的系统 /bin [常用] (/usr/bin 、 /usr/local/bin) 是 Binary 的缩写, 这个目录存放着最经常使用的命令/sbin (/usr/sbin 、 /usr/loca…