从0开始的算法(数据结构和算法)基础(十一)

回溯算法

什么是回溯算法

   回溯算法,根据字面意思来理解这个算法是将每一步的操作可以进行回溯,实际上是对这个每一步的操作进行记录,确保可以返回上一步的操作,可能是对回溯操作之前的做一个复现,也有可能是可操作的回退,这个观点是错误的通过尝试不同的选择并记录当前状态,当遇到不符合要求的解时,能够回溯到之前的状态进行新的尝试,备份回退。 特别适用于解决组合、排列、子集等问题。其核心思想是在搜索过程中,我也不知道为什么,因为在我的理解里面觉得,只要能够回到当前的状态,重新做一个复现,也是可以的只不过耗费时间和空间,一个更大型的穷举,而且可以确定问题出现的多个地方的可能性。

leetcode经典问题

为了解释回溯算法的实际应用流程,我将提供一个简单的回溯算法流程图,以及一个使用 Java 实现的回溯算法示例。以下是解决N 皇后问题的回溯算法流程图及其 Java 代码。

回溯算法流程图

开始
初始化变量
调用递归函数
是否所有皇后都已放置?
记录解
结束
在当前行的每一列尝试放置皇后
放置是否合法?
继续递归到下一行
尝试下一个列

流程图说明

  1. 开始: 算法启动。
  2. 初始化变量: 设置棋盘大小和用于存放皇后位置的数组。
  3. 调用递归函数: 从第一行开始尝试放置皇后。
  4. 是否所有皇后都已放置?: 检查当前行是否已放置所有皇后。
    • : 记录当前解,并结束算法。
    • : 继续尝试在当前行放置皇后。
  5. 在当前行的每一列尝试放置皇后: 遍历当前行的所有列。
  6. 放置是否合法?: 检查当前放置的皇后是否冲突。
    • : 继续递归到下一行。
    • : 尝试在当前行的下一个列放置皇后。

您可以将上述 Mermaid 代码粘贴到支持 Mermaid 的工具或编辑器中(如 Markdown 编辑器、Mermaid Live Editor 等),来查看生成的流程图。希望这能帮助您理解回溯算法的流程!

Java 实现代码:N 皇后问题

以下是一个回溯算法在 Java 中解决 N 皇后问题的示例:

import java.util.ArrayList;
import java.util.List;public class NQueens {public static void main(String[] args) {int n = 4; // 可以改变n的值,来测试不同的棋盘大小List<List<String>> solutions = solveNQueens(n);for (List<String> solution : solutions) {for (String row : solution) {System.out.println(row);}System.out.println();}}public static List<List<String>> solveNQueens(int n) {List<List<String>> result = new ArrayList<>();int[] queens = new int[n];solve(0, n, queens, result);return result;}private static void solve(int row, int n, int[] queens, List<List<String>> result) {if (row == n) {result.add(generateBoard(queens, n));return;}for (int col = 0; col < n; col++) {if (isValid(queens, row, col)) {queens[row] = col;solve(row + 1, n, queens, result);queens[row] = -1;  // 回溯}}}private static boolean isValid(int[] queens, int row, int col) {for (int i = 0; i < row; i++) {if (queens[i] == col || Math.abs(queens[i] - col) == Math.abs(i - row)) {return false;}}return true;}private static List<String> generateBoard(int[] queens, int n) {List<String> board = new ArrayList<>();for (int i = 0; i < n; i++) {char[] row = new char[n];for (int j = 0; j < n; j++) {row[j] = (queens[i] == j) ? 'Q' : '.';}board.add(new String(row));}return board;}
}

代码解读

  1. solveNQueens 方法:初始化棋盘,并调用 solve 方法开始递归。

  2. solve 方法:这个方法使用递归来尝试在每一行放置皇后,并检查当前位置是否安全。如果皇后可以安全放置,则继续递归地解决下一行的问题;如果没有合法的位置,则回溯到前一个状态。

  3. isValid 方法:检查当前放置皇后的状态是否合法,即是否与前面已经放置的皇后发生冲突。

  4. generateBoard 方法:当找到一个解时,生成该解对应的棋盘表示,并将其加入到结果集中。

回溯算法实际应用场景

回溯算法被广泛应用于以下场景:

  • 组合问题:比如组合、排列、子集问题。
  • 图问题:如迷宫问题、图着色问题。
  • 搜索问题:如数独、八皇后问题等。
  • 排列和优化问题:如旅行商问题、背包问题等。

实际生活中的应用

回溯算法在解决组合、排列、约束满足问题等复杂问题时非常有效,它不仅用于计算机科学和数学中,还在实际生活中有广泛的应用。以下是一些回溯算法在实际生活中的应用场景:

1. 旅行路线规划
  • 应用场景:旅行者需要规划一条从起点到终点经过多个城市的路线,并且可能有时间、距离等限制。
  • 回溯算法的作用:回溯算法可以尝试不同的路线组合,评估每一条路线是否满足约束条件(如最短距离或最低花费)。如果某条路线不符合要求,则回退并重新尝试其他路线,最终找到最优解。

滴滴司机顺风车的固定路线的产生
在这里插入图片描述

2. 课程安排与考试安排
  • 应用场景:学校或大学的课程安排或考试安排,必须考虑到多个约束条件(如教师的时间、教室的数量、学生的选课冲突等)。
  • 回溯算法的作用:回溯算法通过尝试不同的安排方式,逐步构建课程或考试安排表,并在发现安排冲突时,回溯到前一步重新安排。它可以帮助生成一份符合所有约束条件的合理排课表或考试表。
    在这里插入图片描述
3. 自然语言处理中的解析问题
  • 应用场景:在自然语言处理(NLP)任务中,解析句子结构时需要考虑语法规则,找到一种符合语法的解析方式。
  • 回溯算法的作用:当某一解析方式不符合语法时,算法可以回溯,尝试其他解析路径。这在语法分析器中常用。
4. 组合优化问题
  • 应用场景:比如商店打折活动中,商家可能要从多个促销组合中选出满足某种条件的最佳方案,如最少成本或者最大收益。
  • 回溯算法的作用:可以通过尝试每种促销组合,当某种组合不满足条件时,回退到前一组并尝试其他促销方案,从而找到最优解。
5. 人力资源的任务分配
  • 应用场景:公司在管理任务分配时,要将任务分配给员工,同时满足员工的时间、技能等多种约束。
  • 回溯算法的作用:尝试为每个任务分配合适的员工,如果某个任务分配不合理,则回退,重新进行分配,最终找到满足所有约束条件的分配方式。

6. DNA测序问题

  • 应用场景:生物信息学中的DNA序列比对,找到最适合的DNA片段拼接方式。
  • 回溯算法的作用:通过尝试不同片段的组合,逐步拼接DNA片段,并在拼接不匹配时回退到之前的步骤,直到找到最合适的拼接方案。

在这里插入图片描述
给个关注呗,持续更新中~~持续输出内容

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

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

相关文章

神经网络中的那些浮点数

模型进行需要大量显存和算力进行支持&#xff0c;精度越高需要的内存和算力也越多&#xff0c;本文将介绍在模型中使用的不同类型的浮点数。 FP32 (Float32)&#xff1a; • 精度和稳定性&#xff1a;FP32 提供 23 位尾数和 8 位指数的高精度 • 性能&#xff1a;尽管 FP32 是通…

学习大数据DAY56 业务理解和第一次接入

作业1 1 了解行业名词 ERP CRM OA MES WMS RPA SAAS 了解每个系统的功能和应用 ERP 系统&#xff0c;&#xff08;Enterprise Resource Planning&#xff0c;企业资源计划系统&#xff09;&#xff1a;ERP 系统 是一种用于管理企业各类资源的软件系统&#xff0c;包括生产管理…

极狐GitLab CI/CD 作业一直处于等待状态,如何解决?

本分分享 GitLab CI/CD Job 不工作的的故障排查方法&#xff1a;当 GitLab Runner 不接受 Job&#xff0c;Job 一直处于等待状态&#xff0c;如何解决此问题。 极狐GitLab 为 GitLab 在中国的发行版&#xff0c;中文版本对中国用户更友好。极狐GitLab 支持一键私有化部署&…

【Hot100】LeetCode—72. 编辑距离

目录 1- 思路题目识别动规五部曲 2- 实现⭐72. 编辑距离——题解思路 3- ACM 实现 原题链接&#xff1a;72. 编辑距离 1- 思路 题目识别 识别1 &#xff1a;两个字符串之间相互转换&#xff0c;增、删、替换 最少的操作次数 动规五部曲 1- 定义 dp 数组 dp[i][j] 代表&…

如何增加Google收录量?

想增加Google收录量&#xff0c;首先自然是你的页面数量就要多&#xff0c;但这些页面的内容也绝对不能敷衍&#xff0c;你的网站都没多少页面&#xff0c;谷歌哪怕想收录都没办法&#xff0c;当然&#xff0c;这是一个过程&#xff0c;持续缓慢的增加页面&#xff0c;增加网站…

11.5.软件系统分析与设计-面向对象的程序设计与实现

面向对象的程序设计与实现 设计模式 Java代码 C代码

神经网络案例实践之单层感知器求解-学习篇

二维线性分类问题 单层感知器作为线性分类器被广泛应用 问题分析&#xff1a; 首先给了五个输入样本&#xff0c;输入样本和位置信息如下所示&#xff0c;现在要学习一个模型&#xff0c;在二维空间中把两个样本分开&#xff0c;输入数据是个矩阵&#xff0c;矩阵中有五个样本…

手写排班日历

手写排班日历&#xff1a; 效果图&#xff1a; vue代码如下&#xff1a; <template><div class"YSPB"><div class"title">排班日历</div><div class"banner"><span classiconfont icon-youjiantou click&qu…

jmeter设置全局token

1、创建setup线程&#xff0c;获取token的接口在所有线程中优先执行&#xff0c;确保后续线程可以拿到token 2、添加配置原件-Http信息头管理器&#xff0c;添加取样器-http请求 配置好接口路径&#xff0c;端口&#xff0c;前端传参数据&#xff0c;调试一下&#xff0c;保证获…

影刀RPA实战:自动化同步商品库存至各大电商平台(二)

在当今的电商世界中&#xff0c;多平台运营已成为常态。商家需要在多个电商平台上维护商品库存的一致性&#xff0c;以确保顾客体验的流畅性和库存管理的高效性。运营人员每天面临的问题&#xff0c;就是把公司的商品库存数据&#xff0c;间断性的同步到电商平台上&#xff0c;…

简单比较 http https http2,我们要如何把http升级为https

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 什么是HTTP 超文本传输​​协议&#xff08;HTTP&#xff09;是用于传输诸如HTML的超媒体文档的应用层协议。它被设计用于Web浏览器和Web服务器之间的通信&#xff0c;但它也…

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 三、其它方式 引言 在C#Form窗体设计中&#xff0c;如果我们不需要使用默认边框设计自己个性化的窗体&#xff08;FromBorderStyl…

2.关于Cloud各种组件的停更/升级/替换

目前主流的cloud组件 备注&#xff1a;黑色部分是springcloud社区原版&#xff0c;红色的是SpringCloud Alibaba。 服务注册与发现 Consul Alibaba Nacos 服务调用和负载均衡 LoadBalancer OpenFeign 分布式事务 Alibaba Seata 服务熔断和降级 Circuit Breaker Alibaba Sentine…

Golang使用ReverseProxy实现反向代理

目录 1.源码结构体 2.官方单机示例 3.使用示例 4.简单的http服务&#xff08;用于测试&#xff09; 1.源码结构体 type ReverseProxy struct {// Rewrite 必须是一个函数&#xff0c;用于将请求修改为要使用 Transport 发送的新请求。然后&#xff0c;其响应将原封不动地…

微软数据库的SQL注入漏洞解析——Microsoft Access、SQLServer与SQL注入防御

说明:本文仅是用于学习分析自己搭建的SQL漏洞内容和原理,请勿用在非法途径上,违者后果自负,与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其相关法规内容【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安全和信息化委员会办公室】 。…

Numba加速计算:最近邻插值(CPU+ GPU + Z轴切块 + XYZ轴切块 + 多线程)

文章目录 最近邻插值&#xff08;加速方法&#xff09;&#xff08;1&#xff09;scipy.ndimage.zoom&#xff08;2&#xff09;Numba-CPU加速&#xff08;3&#xff09;Numba-GPU加速&#xff08;4&#xff09;Numba-CPU加速&#xff08;Z轴切块&#xff09;&#xff08;5&…

分类预测|基于贝叶斯优化长短期记忆网络的数据分类预测Matlab程序 多特征输入多类别输出 BO-LSTM 附赠预测新数据

分类预测|基于贝叶斯优化长短期记忆网络的数据分类预测Matlab程序 多特征输入多类别输出 BO-LSTM 附赠预测新数据 文章目录 一、基本原理BO-LSTM分类预测原理和流程总结 二、实验结果三、核心代码四、代码获取五、总结 分类预测|基于贝叶斯优化长短期记忆网络的数据分类预测Mat…

利用zabbix监控ogg进程(Windows平台)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

QT:音视频播放器

目录 一.播放器设计 二.需要使用的控件 三.选择视频 四.播放视频 五.暂停视频 六.关闭视频 七.播放状态设置 八.切换视频(上一首) 九.切换视频(下一首) 十.设置视频滑块 十一.更新滑块显示 十二.实现效果 十三.代码设计 1.mainwindow.h 2.mainwindow.cpp 一.播放…

Windows上安装RabbitMQ

rabbitmq是干嘛的我就不介绍了&#xff0c;直接开始安装教程。 搭建成功演示图 下载安装包 https://pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51​pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51 下载完后有两个包(erlang和rabbitmq) 先安装otp_win64_24.1.7.exe…