首页 > 编程语言 >回溯算法介绍以及模板

回溯算法介绍以及模板

时间:2024-08-14 11:09:12浏览次数:13  
标签:遍历 递归 算法 回溯 集合 节点 模板

回溯算法的理解:

  • 回溯算法可以理解为一颗树形结构,即一颗n叉树,当遍历到叶子节点的时候,我们就到达了递归的终点,此时我们应该往上走。
  • 回溯法解决的问题都可以抽象为树形结构,是的,我指的是所有回溯法的问题都可以抽象为树形结构!因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度就构成了树的深度

回溯法的效率

回溯法的性能如何呢,回溯并不是什么高效的算法,虽然它很难理解,但是它的本质是枚举出所有情况。

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

那么既然回溯法并不高效为什么还要用它呢?

因为没得选,一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。

回溯算法的模板

  • 回溯函数模板返回值以及参数

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

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

但后面的回溯题目的讲解中,为了方便大家理解,我在一开始就帮大家把参数确定下来。

回溯函数伪代码如下:

void backtracking(参数)
  • 回溯函数终止条件

回溯要有中止条件

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

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

if (终止条件) {
    存放结果;
    return;
}
  • 回溯搜索的遍历过程

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

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

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

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

for循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。

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

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

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

模板的代码:

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

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

标签:遍历,递归,算法,回溯,集合,节点,模板
From: https://www.cnblogs.com/Tomorrowland/p/18358455

相关文章

  • 深入理解微服务中的负载均衡算法与配置策略
    上一期我们详细探讨了微服务之间的通信,特别是介绍了如何集成Ribbon。简单来说,通过使用resttemplate类进行RPC调用时,我们内部增加了一个拦截器来实现负载均衡。然而,我们并未深入讨论具体的负载均衡算法。因此,本章节的重点是介绍如何从多个副本中选择合适的节点进行服务调用。这将帮......
  • MetaLLM大语言模型文本生成算法分析报告
    一、算法安全与监测算法安全信息内容安全方面,MetaLLM算法必须确保生成的文本不包含有害信息,如不当言论、歧视性内容等。这需要在训练数据中进行严格的筛选,并在模型设计时加入过滤机制。信息源安全则关注于训练数据的质量和多样性,以防止偏差和误解。算法监测信息安全监测:持......
  • 商汤AI代码生成算法分析报告
    1.算法安全与监测信息内容安全商汤AI代码生成算法在处理用户输入时,必须确保数据内容的保密性和完整性。由于算法涉及敏感的编程信息,任何未授权的访问或数据泄露都可能导致严重的安全问题。因此,算法应采用加密传输和存储机制来保护数据。信息源安全算法需要验证用户输入的......
  • 基于模糊控制算法的倒立摆控制系统matlab仿真
    1.课题概述       基于模糊控制算法的倒立摆控制系统,模糊规则,模糊控制器等通过MATLAB编程实现,通过模糊控制器对小车倒立摆平衡系统进行控制,输出倒立摆从不稳定到稳定的动画过程,最后输出小车,倒立摆的收敛过程。 2.系统仿真结果   3.核心程序与模型版本:MAT......
  • Unity中利用遗传算法训练MLP
    Unity中利用遗传算法训练MLP梯度下降法训练神经网络通常需要我们给定训练的输入-输出数据,而用遗传算法会便捷很多,它不需要我们给定好数据,只需要随机化多个权重进行N次“繁衍进化”,就可以得出效果不错的网络。这种训练方式的好处就是不需要训练用的预期输出数据,适合那类可以简单......
  • (算法)猜数字⼤⼩II————<暴搜->记忆化搜索->动态规划>
    1.题⽬链接:375.猜数字⼤⼩II2.题⽬描述:3.解法(暴搜->记忆化搜索):算法思路:暴搜:a.递归含义:给dfs⼀个使命,给他⼀个区间[left,right],返回在这个区间上能完胜的最⼩费⽤;b.函数体:选择[left,right]区间上的任意⼀个数作为头结点,然后递归分析左右⼦树。求出所有情况......
  • (算法)最⻓递增⼦序列————<暴搜->记忆化搜索->动态规划>
    1.题⽬链接:300.最⻓递增⼦序列2.题⽬描述:3.解法(暴搜->记忆化搜索->动态规划):算法思路:暴搜:a.递归含义:给dfs⼀个使命,给他⼀个数i,返回以i位置为起点的最⻓递增⼦序列的⻓度;b.函数体:遍历i后⾯的所有位置,看看谁能加到i这个元素的后⾯。统计所有情况下的最⼤值。......
  • 代码随想录算法训练营第二十八天 | 122.买卖股票的最佳时机II , 55. 跳跃游戏 , 45.跳跃
    目录122.买卖股票的最佳时机II 思路方法一:贪心方法二:动态规划55.跳跃游戏思路方法一:使用while循环方法二:使用for循环45.跳跃游戏II 思路方法一方法二方法一:贪心方法一方法二:贪心方法二 方法三:贪心方法三心得体会1005.K次取反后最大化的数组和思路方法......
  • 数学:素性测试算法
    算法简介对一个数的素性测试有很多种做法,有确定性测试的算法,也有概率性测试的算法。确定性素性测试算法确定性素性测试这里介绍两种:线性筛法:利用线性筛在\(O(n)\)的时间复杂度内,将一个范围内的数素性全部求出,然后\(O(1)\)查询。试除法:在\(\sqrt{n}\)内试商,判定是否......
  • 代码随想录算法训练营第十四天(一)| 226.翻转二叉树 101. 对称二叉树
    226.翻转二叉树题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在 [0,100] 内-100<=......