回溯算法 -- 1天

【算法思想:回溯法】回溯算法入门级详解 回溯算法与深度优先遍历 以下是维基百科中「回溯算法」和「深度优先遍历」的定义。 回溯法 采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况: 找到一个可能存在的正确的答案; 在尝试了所有可能的分步方法后宣告该问题没有答案。 深度优先搜索 算法(英语:Depth-Fir 阅读详情

回溯算法理论

回溯法,一般可以解决如下几种问题:

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

回溯算法模板

1、回溯函数模板返回值以及参数

void backtracking(参数)

2、回溯函数终止条件

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

3、回溯搜索的遍历过程

回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。

 伪代码:

for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历

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

                                                                           

77、组合

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

 

回溯法三部曲

1、递归函数的返回值以及参数

vector<vector<int>> result; // 存放符合条件结果的集合
vector<int> path; // 用来存放符合条件单一结果
void backtracking(int n, int k, int startIndex)

2、回溯法的终止条件

path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,在图中path存的就是根节点到叶子节点的路径。

if (path.size() == k) {
    result.push_back(path);
    return;
}

3、搜索过程

for (int i = startIndex; i <= n; i++) { // 控制树的横向遍历
    path.push_back(i); // 处理节点
    backtracking(n, k, i + 1); // 递归:控制树的纵向遍历,注意下一层搜索要从i+1开始
    path.pop_back(); // 回溯,撤销处理的节点
}

可以看出backtracking(递归函数)通过不断调用自己一直往深处遍历,总会遇到叶子节点,遇到了叶子节点就要返回

class Solution {
private:
    vector<vector<int>> result; // 存放符合条件结果的集合
    vector<int> path; // 用来存放符合条件结果
    void backtracking(int n, int k, int startIndex) {
        if (path.size() == k) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i <= n; i++) {
            path.push_back(i); // 处理节点
            backtracking(n, k, i + 1); // 递归
            path.pop_back(); // 回溯,撤销处理的节点
        }
    }
public:
    vector<vector<int>> combine(int n, int k) {
        result.clear(); // 可以不写
        path.clear();   // 可以不写
        backtracking(n, k, 1);
        return result;
    }
};

                                                                                       

剪枝优化

比如当n=4,k=4的时候

 当第二层遍历的时候3就没有意义了。

优化过程

1、已经选择的元素个数:path.size();

2、还需要的个数:k - path.size()

3、集合n中至多要从该起始位置:n - (k - path.size()) + 1,开始遍历

//修改之前
for (int i = startIndex; i <= n; i++) 

//修改之后
for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) // i为本次搜索的起始位置
class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(int n, int k, int startIndex) {
        if (path.size() == k) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) { // 优化的地方
            path.push_back(i); // 处理节点
            backtracking(n, k, i + 1);
            path.pop_back(); // 回溯,撤销处理的节点
        }
    }
public:

    vector<vector<int>> combine(int n, int k) {
        backtracking(n, k, 1);
        return result;
    }
};

[leetcode·回溯算法]回溯算法解题套路框架 回溯算法本质上就是遍历一颗多叉树:1、确定递归终止条件2、执行单层操作逻辑3、确定下一层递归所需的操作列表4、注意剪枝和代码优化。 阅读详情

相关推荐

每日算法&面试题,大厂特训二十八天——第八天(递归|回溯)

目录标题导读算法特训十四天面试题点击直接资料领取 导读 肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!! 特别介绍 ????小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶 ????python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏 ????另外想学JavaWeb进厂

肥学的博客 1595

算法 第24天 回溯1

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。

qq_42799623的博客 245

CTF实战:手把手教你用Python破解转轮机加密(附完整脚本)

本文详细介绍了如何使用Python逆向破解转轮机加密,特别针对CTF比赛中的Crypto类题目。通过解析转轮机加密原理、实战Python脚本编写及调试技巧,帮助参赛者快速掌握破解方法,提升在攻防世界等CTF比赛中的解题效率。

silver的专栏 1116

代码随想录算法训练营第24天 | 回溯算法1

代码随想录算法训练营

X_ar_的博客 198

蒙特卡洛+概率潮流!基于蒙特卡洛和新能源出力模拟的概率潮流分布程序代码!

最后,导出光照强度、风速、网损和节点电压的概率分布图,并计算了各节点电压和网损的平均值和方差,展示了接入前后的节点电压对比图。在不确定性增加的电力系统中,概率潮流成为含随机因素规划问题的求解前提,可以更加真实地反映电力系统的全面信息。此外,概率潮流还可用于研究风电和光伏发电出力以及电动汽车消耗功率和向电力系统反向供电功率的不确定性对电力系统的影响,发现系统运行中的潜在风险,为系统运行控制提供参考。概率潮流的目的是揭示电网中随机变量对系统的影响,发现电网中的薄弱环节,为规划和调度部门的决策提供有价值的信息。

weixin_48747334的博客 1920

手把手教你完成基于matlab的路面裂缝检测系统设计

裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1216

代码训练营第27天:回溯算法part1|leetcode77 组合

理论讲解:回溯算法 leetcode77:组合 目录 1,回溯算法理论基础: 2,leetcode77 组合 3,剪枝操作 1,回溯算法理论基础: 从今天开始的算法篇就是我不熟练的部分,需要学一学理论了。 视频讲解 回溯-递归函数下面部分就是回溯的逻辑 回溯函数=递归函数 回溯搜索法:纯暴力搜索: 可以解决组合问题,切割问题,子集问题,排列问题,棋盘问题 for循环嵌套解决不了 回溯法都可以抽象为一个树结构。 回溯算法模版: void backtracking

weixin_44442376的博客 300

《网络安全自学教程》- SQL注入之报错注入原理+步骤+实战操作

这篇文章为大家解析报错注入的实现原理,结合实战案例讲解报错注入的使用步骤。

wangyuxiang946的博客 1万+

代码随想录算法训练营第二十四天|回溯算法part1

举例:n =4 , k =3 假设size为0那么最多从 4- (3-0) +1 = 2 开始遍历是合理的 -> [2 , 3 , 4]回溯法解决的问题都可以抽象为树形结构,组合的大小构成了树的宽度,递归的深度构成了树的高度。在集合n中至多要从该起始位置 n - (k-path.size())+1 开始遍历。随着path.size()的增加,可选择范围减少,需要的大小为k。(为什么需要+1,因为包括起始位置,需要一个左闭的的集合)k-path.size() : 表示剩下的大小。这是回溯+剪枝的结果。

weixin_44418954的博客 266

(五)深入理解蓝牙BLE之“Beacon包格式详解”

蓝牙Beacon格式详解 本文重点在结合Bluetooth官网spec和几个例子来使beacon帧格式更加容易被理解。 广播帧格式: 首先beacon是蓝牙BLE广播包的一种,蓝牙广播帧格式如下: PS:其实BLE数据帧除了报头字段和数据字段定义与广播帧不同之外,前导/接入地址/长度/校验格式均相同。 广播帧数据字段格式: 数据字段最长为37个字节:6个字节的广播设备地址 + 31个字节广播数据。 广播数据的格式如下:AD Structure1 +AD Structure2 + .....

1万+

系统建模语言 (SysML)

系统建模语言

追赶时代的博客 749

代码随想录算法训练营第三十天|回溯总结、day1题目复习

回溯一种暴力穷举法,效率不高,但是对于一些无限套for可能无法解决的问题能够轻易化解for循环横向遍历,递归纵向遍历,回溯不断调整结果集,从而遍历每一种可能组合问题在N个数中按照规则找出K个数的集合,收集的是叶子节点分为有重复元素和无重复元素,有重复元素需要排序去重,used数组或set终止条件通常为满足集合的条件剪枝的精髓在于for循环在寻找起点的时候要有一个范围,如果这个起点到集合终止之间的元素已经不够题目要求的k个元素了,就没有必要搜索了。排列问题。

weilana的博客 304

C#利用最小二乘法拟合任意次函数曲线

给出一组离散点,确定一个函数逼近原函数,插值是这样的一种手段。在实际中,数据不可避免的会有误差,插值函数会将这些误差也包括在内。因此,我们需要一种新的逼近原函数的手段: ①不要求过所有的点(可以消除误差影响);②尽可能表现数据的趋势,靠近这些点。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小 [1],其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达,具体可以查阅相关资料。最小二乘法(又称最小平方法)是一种数学技术。

qq_30725967的博客 3755

代码随想录第二十四天| 回溯算法P1 | ● 理论基础 ● 77.

回溯算法的理论基础,包括回溯法的适用题目、回溯法的基本理论、算法模板框架。 力扣 77.组合 回溯算法的设计、剪枝的思路 有一个更容易理解的解释。

FhilMs的博客 1063

专栏目录:Linux 内存管理子系统的进化——从 MM 到 HMM

专栏梳理了Linux内存管理子系统从经典MM到异构内存管理(HMM)的演进历程。内容分为六大部分:首先介绍经典MM基础,包括虚拟地址空间、页表、VMA等核心机制;其次分析MM通用框架如页表遍历、NUMA迁移等;然后探讨设备内存引入的关键技术,如ZONE_DEVICE和dev_pagemap;接着深入解析HMM核心机制及其与DMA的集成;随后通过多个实际驱动案例展示HMM应用;最后讨论大页支持等进阶主题。专栏采用"经典机制→问题→扩展方案"的三段式结构,帮助开发者理解Linux如何通过HMM实现设备内存管理。

图形/计算GPU的驱动与虚拟化技术分享园地 870

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

开始学算法 x+1天 ===> 回溯探索第二章!哥布林丛林周围(LeetCode刷题!!!)

回溯算法 Java

weixin_45576579的博客 938

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

代码随想录算法训练营第二十四天|1.回溯理论简介、77. 组合

无

fan15157721331的博客 99

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

回溯算法详解

我们刷leetcode的时候,经常会遇到回溯算法类型题目。回溯算法是五大基本算法之一,一般大厂也喜欢问。什么是回溯算法?一道算法题走进回溯算法回溯算法框架套路leetcode案例分析回溯算法,一种通过探索所有可能的候选解来找出所有的解的算法。它采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。找到一个可能存在的正确的答案;

Blue_Pepsi_Cola的博客 7240

【算法专题】回溯算法

介绍回溯算法以及如何使用回溯算法解题!

YoungMLet的博客 3307

【算法】回溯算法

回溯算法

Code 小白的博客 6164

0-1背包问题(回溯算法)

关于0-1背包问题是回溯算法的一个经典例子 就这个问题来记录一下自己对回溯算法的初步理解 因为自己对这个算法也只是入门阶段 所以有什么不正确的地方 欢迎大家指正 1.我个人理解(现目前阶段的理解):回溯算法 顾名思义就是不断往回算 举个例子:你要从A地点到B地点 在这个过程中有有限个路口任你选择 1.我对你加了约束条件 在从A到B的这个过程中你不能超过一个时间T 超过你就不能继续走这条路...

fulishafulisha的博客 1万+

C++编程-搜索与回溯算法1

搜索与回溯算法1

weixin_68261272的博客 2395

5.1 回溯法的算法框架

回溯法被誉为“通用的解题方法”,能够系统地搜索问题的所有解或找到问题的一个解。它是一个既具有系统性又具有跳跃性的搜索算法。在问题的解空间树中,按照深度优先策略,从根节点出发搜索解空间树。当算法搜索到解空间树的任一节点时,首先判断该节点是否包含问题的解——如果确定不包含,则跳过对以该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。子集树和排列树是解决组合问题的两个基本工具,它们各自对应于不同的问题类型。

tang7mj的博客 1920

[图解算法]1,回溯算法,简单易懂的让你理解回溯算法

[图解算法]1,回溯算法,简单易懂的让你理解回溯的原理和思路

qq_52314655的博客 2922

从0到1的回溯算法学习

学完二叉树,如果你对于回溯算法还是一窍不通,那么本文可以帮到你

2402_88307286的博客 1194

【算法】回溯算法专题③ ——排列型回溯 python

回溯法是一种通过尝试每一种可能性来找到所有解的算法。对于N皇后问题,特别是带有额外约束条件的问题(如本题中的皇后之间在同一条45度角斜线上至少相隔3行),回溯法是一个非常合适的选择。

查理零世的博客 1653
上一篇: 代码随想录训练营第七天
下一篇: 回溯算法 ----- 第2天
七人酒
博客等级 码龄4年 51粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值