广度优先搜索(BFS)-蓝桥杯

news2024/9/23 23:28:05

一、BFS搜索的原理

  • BFS搜索的原理:“逐层扩散”,从起点出发,按层次从近到远,逐层先后搜索。

  • 编码:用队列实现。

  • 应用:BFS一般用于求最短路径问题,BFS的特点是逐层搜索,先搜到的层离起点更近。

二、BFS:找最短路路径

  • 应用场合:点和点直接的距离是1,即边长是1。

寻找从@到*的最短路径。
  • 使用队列来实现。

  • 最短路径问题用BFS解决(逐层扩散)。

  • 往BFS的队列中加入邻居结点时,按距离起点远近的顺序加入: 先加入距离起点为1的邻居结点,加完之后,再加入距离为2的邻居结点,等等。搜完一层,才会继续搜下一层。

三、输出路径的两种方法

  • 简单方法:

  • 每扩展到一个点v,都在v上存储从起点s到v的完整路径,到达终点t时,便得到了从起点s到t的完整路径。

  • 优点:简单、适合小图。

  • 缺点:占用大量空间,因为每个点上都存储子完整的路径,不适合大图。

  • 标准方法:

  • 在每个点上记录它的前驱点,从终点一步步回溯到起点,就可以得到一条完整路径。

  • 优点:节省空间,因为每个点上只存储了上一个点,适合大图。

四、蓝桥杯真题(602号)


  • 题目求字典序最小的最短路径。

  • 在每次扩散下一层(往BFS的队列中加入下一层的结点)时,按字典序“D<L<R<U”的顺序加下一层的结点,那么第一个搜到的最短路径就是字典序最小的。

  • 计算复杂度每个点只搜一次,即进入队列和出队列一次。复杂度O(n),n是迷宫内结点的总数。

  • BFS能用于解决1千万个点的最短路问题。


  • 输出路径的两种方法:

  • 简单方法

  • 标准方法

路径打印:从终点递归到起点,然后打印

读迷宫代码:

BFS队列实现:

五、连通性判断: BFS

  • BFS判断连通性的步骤:

  1. 从图上任意一个点u开始遍历,把它放进队列中。

  1. 弹出队首u,标记u已搜过,然后搜索u的邻居点,即与u连通的点,放到队列中。

  1. 继续弹出队首,标记搜过,然后搜索与它连通的邻居点,放进队列。

  1. 继续以上步骤,直到队列为空,此时一个连通块已经找到。其他没有访问到的点,属于另外的连通块,按以上步骤再次处理这些点。

  1. 最后所有点都搜到,所有连通块也都找到。

六、BFS的三种实现

  • queue

  • list

  • deque (最快)

用下面的“178号真题”演示三种实现。

七、蓝桥杯真题(178号)

  • BFS连通性判断:图论的一个简单问题,给定一张图,图由点和连接点的边组成,要求找到图中互相连通的部分。


  • 什么岛屿不会被完全淹没?

若岛中有个陆地 (称为高地),它周围都是陆地,那么这个岛不会被完全淹没。

用BFS搜出有多少个岛 (连通块),检查这个岛有没有高地,统计那些没有高地的岛(连通块) 的数量,就是答案。

计算复杂度:每个像素点只用搜一次且必须至少搜一次,共N^2个点,BFS的复杂度是O(N^2),不可能更好了。


1.queue

2.list

3.deque

八、BFS判重

  • BFS=队列

  • BFS:逐步扩展下一层,把扩展出的下一层状态放进队列中处理。

  • 如果这些状态有相同的,只需搜一次,只需要进入队列一次。

  • 必须判重。

  • Python判重方法:字典、set()。

1.字典判重

  • 字典:无序、可变、有索引的集合。

  • 字典:用花括号定义,有键和值。

2. set判重

  • set()函数创建一个无序、不重复元素集

  • 关系测试,删除重复数据,计算交集、差集、并集、补集。

九、双向广搜

  • 应用场景:有确定的起点s和终点t;把从起点到终点的单向搜索,变换为分别从起点出发和从终点出发的“相遇”问题。

  • 操作: 从起点s(正向搜索) 和终点t(逆向搜索) 同时开始搜索,当两个搜索产生相同的一个子状态v时就结束,v是相遇点。得到的s-v-t是一条最佳路径。

  • 队列:一般用两个队列分别处理正向BFS和逆向BFS。

  • 双向广搜的复杂度

  • 当下一层扩展的状态很多时,双向广搜能大大优化,减少大量搜索。

  • 由于起点和终点的串不同,正向BFS和逆向BFS扩展的下一层数量也不同,也就是进入2个队列的串的数量不同,先处理较小的队列,可以加快搜索速度。

十、蓝桥杯真题(178号)


  • 分析:从起始状态到终止状态,求最少跳跃次数,是一个最短路径问题,用BFS。

  • 建模:直接让炸蜢跳到空盘有点麻烦,因为有很多在跳。反过来看,让空盘跳,跳到虾蜢的位置,简单多了,只有一个空盘在跳。

  • 化圆为线:题目是一个圆圈,不好处理,用一个建模技巧“化圆为线”,把圆形转换为线形。

  • 把空盘看成0,有9个数字{0,1,2,3,4,5,6,7,8},一个圆圈上的9个数字,拉直成了一条线上的9个数字,这条线的首尾两个数字处理成相连的。

  • 八数码问题:有9个数字{0,1,2,3,4,5,6,7,8},共有9!=362880种排列,不算多。

  • 最短路径

  • 初始状态:“012345678”,目标状态:“087654321”。

  • 从初始状态“012345678”跳一次,有4种情况:“102345678”、“210345678”“812345670”、“712345608”。

  • 然后从这4种状态继续跳到下一种状态,一直跳到目标状态为止。

  • 用BFS扩展每一层。

  • 每一层就是炸蜢跳了一次,扩展到某一层时发现终点“087654321”,这一层的深度就是蛇蟠跳跃的次数。

  • 为什么去重?

  • 如果不去重:第1步到第2步,有4种跳法;第2步到第3步,有4*4种;...;第20步,有4^20 =1万亿种,那可就完犊子了。

  • 判断有没有重复跳,如果跳到一个曾经出现过的情况,就不用往下跳了。一共只有9!=362880种情况。

  • 代码复杂度

  • 在每一层,能扩展出最少4种、最多362880种情况,最后算出的答案是20层,那么最多算20*362880=7257600次。在代码中统计实际的计算次数,是1451452次。

  • 队列:最多有9!=362880种情况进入队列。


1. 字典去重,用list实现队列,速度慢:3s

2. set()去重,用list实现队列,速度快:1.4s

3.双向广搜

队列q1 : 正向搜索

队列q2 : 逆向搜索

  • 用cnt统计运行了多少次:54568次。

  • 前面用普通BFS计算:1451452次。

  • 双向广搜的计算量只有4%。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Prometheus 记录规则和警报规则

前提环境&#xff1a; Docker环境 涉及参考文档&#xff1a; Prometheus 录制规则Prometheus 警报规则 语法检查规则 promtool check rules /path/to/example.rules.yml一&#xff1a;录制规则语法 groups 语法&#xff1a; groups:[ - <rule_group> ]rule_group…

Redis 强化

(Redis入门使用查看)https://blog.csdn.net/weixin_73849581/article/details/128390152?spm1001.2014.3001.5501缓存使用原则什么时候,什么样的数据能够保存在Redis中?1.数据量不能太大2.使用越频繁,Redis保存这个数据越值得3.保存在Redis中的数据一般不会是数据库中频繁修改…

❤️Selenium实战操作,获取图片详解(内附源码)⚡

👋👋最近也是想换壁纸了,所以来一期详细的selenium获取壁纸教程。 公众号:测个der 源码地址:https://gitee.com/qinganan_admin/reptile-case.git 遇事不决就用selenium就对了。 💨💨目标地址:https://desk.zol.com.cn/dongman/ 目标存在地点: 好了解之后,…

GoLang设置gofmt和goimports自动格式化

目录 设置gofmt gofmt介绍 配置gofmt 设置goimports goimports介绍 配置goimports 设置gofmt gofmt介绍 Go语言的开发团队制定了统一的官方代码风格&#xff0c;并且推出了 gofmt 工具&#xff08;gofmt 或 go fmt&#xff09;来帮助开发者格式化他们的代码到统一的风格…

c/c++开发,无可避免的模板编程实践(篇四)

一、容器与模板 前文就说到&#xff0c;标准库基于模板编程&#xff0c;定义了许多容器类以及一系列泛型算法&#xff0c;使程序员可以更简洁、抽象和有效地编写程序。C标准库中有大量的标准容器&#xff0c;这些容器通常包含一组数据或对象的集合&#xff0c;几乎可以和任何类…

剑指 Offer 48. 最长不含重复字符的子字符串

摘要 剑指 Offer 48. 最长不含重复字符的子字符串 一、滑动窗口解析 这样一来&#xff0c;我们就可以使用「滑动窗口」来解决这个问题了&#xff1a; 我们使用两个指针表示字符串中的某个子串&#xff08;或窗口&#xff09;的左右边界&#xff0c;其中左指针代表着上文中枚…

解决Edge浏览器主页被篡改问题,或许可以帮你彻底解决

问题描述&#xff1a; 之前从一个第三方网站下载了一个不知名软件&#xff0c;接着电脑就各种下载360全家桶之类的软件&#xff0c;后来问题解决了&#xff0c;但是还残留了一些问题&#xff0c;前几天发现edge浏览器的主页被改成了360导航&#xff0c;就是那个该死的hao123&a…

TSITDM 的图

TSI (汽轮机监视保护系统) 时域信号的处理 TDM(Turbine Diagnosis Management) 对时域信号进行频域分析 频谱图&#xff08;Frequency Spectrogram Plot&#xff09;&#xff1a; 横轴是频率值&#xff0c;纵轴是振幅(被测信号在该频率下的能量值) 很多的故障都有自己特定的频…

吉林大学软件需求分析与规范(Software Requirements Analysis Specification)

chapter0课程简介&#xff1a;◼ 软件工程专业核心课程之一◼ 软件工程课程体系最前端课程◼ 主要内容&#xff1a;需求的基本概念&#xff0c;需求的分类&#xff0c;需求工程的基本过程&#xff0c;需求获取的方法、步骤、技巧&#xff0c;需求分析和建模技术&#xff0c;需求…

前端PWA渐进式加载技术

1.什么是PWA&#xff1f; 渐进式网络应用&#xff08;PWA&#xff09;是谷歌在2015年底提出的概念。基本上算是web应用程序&#xff0c;但在外观和感觉上与原生app类似。支持PWA的网站可以提供脱机工作、推送通知和设备硬件访问等功能。 2.PWA有那些优点&#xff1f; 更小更…

JVM学习总结,虚拟机性能监控、故障处理工具:jps、jstat、jinfo、jmap、Visual VM、jstack等

上篇&#xff1a;JVM学习总结&#xff0c;全面介绍运行时数据区域、各类垃圾收集器的原理使用、内存分配回收策略 参考资料&#xff1a;《深入理解Java虚拟机》第三版 文章目录三&#xff0c;虚拟机性能监控、故障处理工具1&#xff09;jps&#xff1a;虚拟机进程状况工具2&…

清风1.层次分析法

一.流程1.建立评价体系2.建立判断矩阵2.1 A-C-C矩阵从准则层对目标层的特征向量上看&#xff0c;花费的权重最大算术平均法求权重的结果为&#xff1a;0.26230.47440.05450.09850.1103几何平均法求权重的结果为&#xff1a;0.26360.47730.05310.09880.1072特征值法求权重的结果…

人工智能轨道交通行业周刊-第34期(2023.2.13-2.19)

本期关键词&#xff1a;智慧地铁、枕簧检测选配机器人、智慧工地、接触网检修、工业缺陷检测 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro…

Spring boot整合mongodb

1.下载及说明 下载地址&#xff1a;Try MongoDB Atlas Products | MongoDB 下载之后在mongodb的文件夹中配置data文件用来存放数据。 传统的关系数据库一般由数据库&#xff08;database&#xff09;、表&#xff08;table&#xff09;、记录&#xff08;record&#xff09;…

Java实现 华为2016校园招聘上机笔试题(牛客网能不能用点心......题目不完整、不清楚)

文章目录最高分是多少简单错误记录扑克牌大小牛客网…能不能用点心&#xff0c;题目根本不完整&#xff0c;是不是包含多组输入也不说&#xff0c;还是百度了别人的博客&#xff0c;才看到的完整题目&#xff0c;无语了… 最高分是多少 输入都不完整&#xff1a;以下是看别人的…

爆红的chatgpt是如何诞生的?程序员要如何使用

大家好&#xff0c;小编来为大家解答以下问题爆红的chatgpt是如何诞生的?&#xff0c;一个有趣的事情&#xff0c;一个有趣的事情程序员要如何使用&#xff0c;现在让我们一起来看看吧&#xff01; 1、chatGPT是哪个公司做的&#xff1f; Chatgpt &#xff08;中文&#xff1…

Ubuntu 20 安装包下载(清华镜像)

Ubuntu 20 安装包下载在国内推荐使用清华大学镜像 清华镜像地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/ 在搜索框中输入Ubuntu&#xff0c;然后点击Ubuntu -release&#xff0c;这里面有近几年的Ubuntu镜像 点击你想下载的版本&#xff0c;我选择的是20.0413点击…

tauri 打包现有React 项目(window)

注意事项&#xff1a;1.此项目没有路由&#xff0c;2.没有 API请求 环境配置 请看文档 tauri 文档 第一步&#xff1a;在需要打包的项目根目录执行命令 npm install --save-dev tauri-apps/cli第二步&#xff1a;在 package.json scripts 中添加 tauri "scripts": …

使用canvas实现腾讯自选股K线图

前言 平常为了方便看行情就会打开小程序看走势&#xff0c;作为一个开发在看腾讯自选股的日K时就会在想这个玩意是怎么弄的呢&#xff1f;下面我就用h5来实现一个最简K线图。 K线的构成以及画法 K线又称阴阳线、棒线、红黑线或蜡烛线。K线是一条柱状的线条&#xff0c;由实体…

[数据结构]---八大经典排序算法详解

&#x1f427;作者主页&#xff1a;king&南星 &#x1f3f0;专栏链接&#xff1a;c 文章目录一、八大排序算法复杂度对比二、基于比较的排序算法1.冒泡排序2.选择排序3.插入排序4.希尔排序5.直观感受四种算法的时间复杂度三、基于非比较的排序算法1.基数排序2.箱(桶)排序四…