【递归,搜索与回溯算法】穷举 vs 暴搜 vs 深搜 vs 回溯 vs 剪枝算法入门专题详解

    

 


     前言     

    什么是回溯算法?    


  • 回溯算法是一种经典的递归算法,通常用于解决组合问题、排列问题和搜索问题等。

     回溯算法的基本思想     


  • 从一个初始状态开始,按照一定的规则向前搜索,当搜索到某个状态无法前进时,回退到前一个状态,再按照其他的规则搜索。
  • 回溯算法在搜索过程中维护一个状态树,通过遍历状态树来实现对所有可能解的搜索。

    回溯算法的核心思想    


  • “试错”,即在搜索过程中不断地做出选择,如果选择正确,则继续向前搜索;
  • 否则,回退到上一个状态,重新做出选择。
  • 回溯算法通常用于解决具有多个解,且每个解都需要搜索才能找到的问题。

     回溯算法的应用     


    总结    
  • 回溯算法是一种非常重要的算法,可以解决许多组合问题、排列问题和搜索问题等。回溯算法的核心思想是搜索状态树,通过遍历状态树来实现对所有可能解的搜索。
  • 回溯算法的模板非常简单,但是实现起来需要注意一些细节,比如如何做出选择、如何撤销选择等。

 


全排列


    1. 题目解析    


 


    2. 算法原理    


    解法 一 : 暴力枚举    


我们可以定义三层 for 循环,来解决这道问题;但是如果要枚举的数数量非常大呢?我们肯定不可能嵌套太多层循环; 


    解法二:递归    


像这种穷举的题目,使用暴力枚举是非常麻烦的,此时,我们可以使用递归;不同回溯的题使用模板是有出入的,我们做这类递归回溯的题,最重要弄清楚背后的原理,要能够清楚地画出决策树,很多时候模板会限制我们的思维;


    2.1 决策树     


   2.1.1 决策树的定义   


   2.1.2 画出决策树    

把每一步的决策画出来,我们就可以实现不重不漏地枚举出所有的情况,最开始的节点表示刚开始的位置枚举的所有节点; 


   2.2 全局变量    


    2.2.1 全局变量的定义方法    


需要一个全局变量的 List<List<Integer>> ,来记录我们的最终结果; 

两种方法都能起到记录的效果,但是最好还是在方法外单独定义出来这个全局变量;只需要在方法中重新实例化全局变量即可


    2.2.2 定义全局变量    




   2.3 dfs() 函数    



仅需关心某一个节点在做什么:


   2.4 处理细节问题    


    2.4.1 递归出口    


在决策树中,我们不需要遍历被剪枝的节点所在的路径,所以在遍历到决策树的叶子节点时,直接添加结果即可;如果 path.size() == nums.length,说明已经遍历该路径所有节点,类似 root==null;

那可以在返回之前,add 之后,先恢复现场吗?可以,但是没必要;我们可以回溯到上一层之后,再统一进行恢复现场;


    2.4.2 剪枝     


我们对决策树的一层剪枝进行分析,通过分析设置出剪枝对应的操作 

 


定义全局变量 check 数组

boolean 数组的作用:标记在某一条路径上,当前遍历的数对应的nums的下标的使用情况;


boolean 元素记录的是 nums 数组对应的下标,而不是下标对应的元素,如果在递归到下一个数,发现这个数对应 check 的元素是 true,则说明当前遍历元素是重复元素,也因此无法进入判断条件:


    2.4.3 回溯    


当递归到决策树的最后一层,需要把 path 回溯给上一层,此时需要恢复现场用于其他分支的递归,所以需要去掉最后一个元素;

因为 check 数组也是全局变量,所以我们需要对 path 和 check 同时进行恢复现场;



   2.5  总结    


   3. 编写代码    



 子集


     题目解析   



    算法原理    


     解法一:固定一个元素,枚举下一个元素选或不选     


  


    决策树     

 

   全局变量    



    设计函数结构    


 根据这个决策树,我们设计出函数头 dfs( nums , i )


  


    解法二:根据子集的元素个数,枚举所有子集    



     决策树     


 

注意:决策树执行添加元素的操作前,要先从子集末尾元素来判断是否可以添加;如 [1 , 2 ] 子集,可以添加子集个数为 [ 1 , 2 , 3 ],如果是 [ 2 , 3 ] ,[ 3 ] 这样的子集,则不能继续添加元素;

    全局变量    



    设计函数结构     



从两棵树的节点个数来看,第二棵决策树是优于第一棵决策树的;


    编写代码    


     解法一:   


     解法二:    


    

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之桥接模式:抽象与实现之间的分离艺术

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 桥接模式概述与角色组成 想象一下你家里的电视遥控器&#xff0c;无论是索尼还是三星的电视机&#xff0c;遥控器的按键功能都差不多&#xff1…

ASRPRO学习笔记一之语音模型位置和语音替换

一、语音替换的步骤 1、扬声器录音 打开GoldWave,点击工具栏中的蓝色控制属性按钮&#xff0c;点击设备&#xff0c;选择扬声器&#xff0c;点击ok。打开电脑上的网易云音乐&#xff0c;点击红色的录制按钮&#xff0c;开始录制音乐&#xff0c;在网易云音乐上点击播放音乐,录…

多因子认证 (Multi-factor authentication, MFA)

多因子认证 (MFA) 是一种思想&#xff0c;而UsernamePassword&#xff0c;OTP等是具体的认证手段。多因子认证就是将这些认证手段结合。 目录 什么是MFAMFA的作用MFA的实际应用 认证认证 (Authentication, AuthN) 因素常见的认证 (Authentication, AuthN) 类型密码认证无密码认…

内存压缩禁用设置

设置禁用内存压缩功能 1、“Win”“X”键→“A”键 2、如果输入“Get-MMAgent”并按“Enter”键&#xff0c;则可以从“MemoryCompression”中检查内存压缩功能的状态。 True启用&#xff0c;False禁用 3、要禁用内存压缩功能&#xff0c;请输入“Disable-MMAgent -mc”并…

素数回文数的个数

素数回文数的个数 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 求11到n之间&#xff08;包括n&#xff09;&#xff0c;既是素数又是回文数的整数有多少个。 输入 一个大于11小于1000的整数n。 输出…

QT网络(一):主机信息查询

网络简介 在QT中进行网络通信可以使用QT提供的Qt Network模块&#xff0c;该模块提供了用于编写TCP/IP网络应用程序的各种类&#xff0c;如用于TCP通信的QTcpSocket和 QTcpServer&#xff0c;用于 UDP 通信的 QUdpSocket&#xff0c;还有用于网络承载管理的类&#xff0c;以及…

Flutter Navigator2.0的原理和Web端实践

01 背景与动机 在Navigator 2.0推出之前&#xff0c;Flutter主要通过Navigator 1.0和其提供的 API&#xff08;如push(), pop(), pushNamed()等&#xff09;来管理页面路由。然而&#xff0c;Navigator 1.0存在一些局限性&#xff0c;如难以实现复杂的页面操作&#xff08;如移…

如何在谷歌浏览器中开启安全浏览

在数字化时代&#xff0c;网络安全变得愈发重要。作为全球最受欢迎的网络浏览器之一&#xff0c;谷歌浏览器提供了多种功能来保护用户的在线安全。本文将详细介绍如何在谷歌浏览器中开启安全浏览&#xff0c;并额外提供一些有用的页面滚动设置、地址栏快捷搜索和跟踪防护的相关…

【物联网技术与应用】实验3:七彩LED灯闪烁

实验3 七彩LED灯闪烁 【实验介绍】 七彩LED灯上电后&#xff0c;7色动闪光LED模块可自动闪烁内置颜色。它可以用来制作相当吸引人的灯光效果。 【实验组件】 ● Arduino Uno主板* 1 ● USB数据线* 1 ● 7彩LED模块*1 ● 面包板*1 ● 9V方型电池*1 ● 跳线若干 【实验原…

直播美颜插件开发全流程:从美颜sdk的集成到实际部署

对于开发者来说&#xff0c;如何高效地开发和部署一个直播美颜插件&#xff0c;则需要从美颜SDK的集成到实际部署的全流程把控。本篇文章&#xff0c;我将详细解析这个流程中的关键技术和核心环节&#xff0c;助力开发者高效完成项目交付。 一、项目需求分析与技术选型 在开发…

【物联网技术与应用】实验4:继电器实验

实验4 继电器实验 【实验介绍】 继电器是一种用于响应施加的输入信号而在两个或多个点或设备之间提供连接的设备。换句话说&#xff0c;继电器提供了控制器和设备之间的隔离&#xff0c;因为设备可以在AC和DC上工作。但是&#xff0c;他们从微控制器接收信号&#xff0c;因此…

ESP32-S3外接SSD1306 OLED显示8*8字符和16*16汉字

一、接线图 二、实物 三、代码 #include <stdio.h> #include <string.h> #include "unity.h" #include "driver/i2c_master.h" #include "driver/gpio.h" #include "esp_lcd_panel_io.h" #include "esp_lcd_pane…

【Qt】QWidget中的常见属性及其功能(二)

目录 六、windowOpacity 例子&#xff1a; 七、cursor 例子&#xff1a; 八、font 九、toolTip 例子&#xff1a; 十、focusPolicy 例子&#xff1a; 十一、styleSheet 计算机中的颜色表示 例子&#xff1a; 六、windowOpacity opacity是不透明度的意思。 用于设…

Nginx Proxy Manager如何管理与配置反向代理服务并实现远程访问

文章目录 前言1. 一键安装2. 本地访问3. Linux 安装cpolar4. 配置公网访问地址5. 公网远程访问6. 固定公网地址 前言 Nginx Proxy Manager 是一个开源的反向代理工具&#xff0c;不需要了解太多 Nginx 或 Letsencrypt 的相关知识&#xff0c;即可快速将你的服务暴露到外部环境…

vscode中同时运行两个python文件(不用安装插件)

如何在vscode中同时运行两个python文件呢&#xff1f;今天在工作中遇到了这个问题。 查了网上的方法是安装coder runner插件&#xff0c;后来发现自身就有这个功能。所以记录一下,方便后续查找: 这是我的第一个文件&#xff0c;点击右上角的运行旁边的小箭头&#xff0c;有一…

Visio——导出的PDF文件缺乏嵌入字体的解决办法 / 设置导出的PDF文件添加嵌入字体的方法

导出PDF时&#xff0c;勾选 “符合PDF/A” 选项 这样就导出的PDF文件添加了嵌入字体了。

皮肤伤口分割数据集labelme格式248张5类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;284 标注数量(json文件个数)&#xff1a;284 标注类别数&#xff1a;5 标注类别名称:["bruises","burns","cu…

cpolar使用步骤

功能&#xff1a;内网穿透 下载地址&#xff1a;cpolar - secure introspectable tunnels to localhost 1 找到安装目录 2 进入命令行 目录处输入 cmd 3 验证 authtoken 不同用户 验证码不同。 注册后可以使用 cpolar.exe authtoken MzBlNzMwODktZjA3Yi00ZjJlLWJiMzQtNWU…

模具制造之三维扫描和逆向建模

模具是在工业生产中&#xff0c;用各种压力机和装在压力机上的专用工具&#xff0c;通过压力把金属或非金属材料制出所需形状的零件或制品&#xff0c;这种专用工具称为模具。模具的形状决定着这些产品的外形&#xff0c;模具的加工质量与精度也就决定着这些产品的质量。 汽车挡…

压力测试Jmeter简介

前提条件&#xff1a;要安装JDK 若不需要了解&#xff0c;请直接定位到左侧目录的安装环节。 1.引言 在现代软件开发中&#xff0c;性能和稳定性是衡量系统质量的重要指标。为了确保应用程序在高负载情况下仍能正常运行&#xff0c;压力测试变得尤为重要。Apache JMeter 是一…