当前位置: 首页 > news >正文

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

一、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%。

相关文章:

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

一、BFS搜索的原理BFS搜索的原理&#xff1a;“逐层扩散”&#xff0c;从起点出发&#xff0c;按层次从近到远&#xff0c;逐层先后搜索。编码&#xff1a;用队列实现。应用&#xff1a;BFS一般用于求最短路径问题&#xff0c;BFS的特点是逐层搜索&#xff0c;先搜到的层离起点…...

Java Type类

文章目录Type简介Type分类1. 原始类型(Class)2. 参数化类型(ParameterizedType)3. 类型变量(TypeVariable)4. 通配符类型(WildcardType)5. 泛型数组类型(GenericArrayType)Type简介 Type是Java编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型…...

Springboot扩展点之CommandLineRunner和ApplicationRunner

Springboot扩展点系列&#xff1a;Springboot扩展点之ApplicationContextInitializerSpringboot扩展点之BeanFactoryPostProcessorSpringboot扩展点之BeanDefinitionRegistryPostProcessorSpringboot扩展点之BeanPostProcessorSpringboot扩展点之InstantiationAwareBeanPostPro…...

ngixn 常用配置之文件类型与自定义 log

大家好&#xff0c;我是 17 。 总结了一些 nginx 的常用配置。从入口文件开始&#xff0c;今天讲一下文件类型和自定义log 为了讲述方便&#xff0c;环境为 CentOS 7&#xff0c; nginx 版本 1.21。 配置文件入口 /etc/nginx/nginx.conf这是入口文件&#xff0c;这个文件里…...

【100个 Unity实用技能】 | Unity 通过自定义菜单将资源导出

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…...

0.3调试opencv源码的两种方式

调试opencv源码的两种方式 上两篇我们分别讲了如何配置opencv环境&#xff0c;以及如何编译opencv源码方便我们阅读。但我们还是无法调试我们的代码&#xff0c;无法以我们的程序作为入口来一步一步单点调试看opencv是如何执行的。 【opencv源码解析0.1】VS如何优雅的配置ope…...

Redis的常见操作和Session的持久化

安装Redis使用yum命令&#xff0c;直接将redis安装到linux服务器&#xff1a;yum -y install redis启动redis使用以下命令&#xff0c;以后台运行方式启动redis&#xff1a;redis -server /etc/redis.conf &操作redis使用以下命令启动redis客户端&#xff1a;redis-cli设置…...

TypeScript笔记(二)

背景 上一篇文章我们介绍了TypeScript的一些特性&#xff0c;主要是其与JavaScript的比较&#xff0c;接下来我们将会开始学习Type的语法&#xff0c;这篇文章将会介绍TypeScript的数据类型。 原始数据类型 TypeScript是JavaScript的超集&#xff0c;TypeScript的数据类型就…...

【MyBatis】源码学习 03 - 类型处理器 TypeHandler

文章目录前言参考目录学习笔记1、type 包中类的归类总结2、类型处理器2.1、TypeReference 类3、类型注册表3.1、TypeHandlerRegistry#getTypeHandler前言 本文内容对应的是书本第 8 章的内容&#xff0c;主要是关于类型处理器 TypeHandler 的学习。 这一章节的学习有些地方理…...

建造《流浪地球2》中要毁灭人类的超级量子计算机MOSS的核心量子技术是什么?

1.《流浪地球2》中的量子计算机 2023年中国最火的电影非《流浪地球2》莫属&#xff0c;在《流浪地球2》中有一个人工智能机器人MOSS &#xff0c;它的前身是“550W”超级量子计算机&#xff0c;“MOSS”是它给自己起的名字&#xff08;“550W”倒转180度就是“MOSS”&#xff…...

数据结构~七大排序算法(Java实现)

目录 插入排序 直接插入排序 希尔排序 选择排序 直接选择排序 堆排序 交换排序 冒泡排序 快速排序 递归实现 优化版本 归并排序 插入排序 直接插入排序 public class MySort {public static void insertSort(int[] array) {for (int i 1; i < array.length;…...

python练习

项目场景一&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 问题描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶…...

RPC-thrift实践

参考&#xff1a;https://www.cnblogs.com/52fhy/p/11146047.html 参考&#xff1a;https://juejin.cn/post/7138032523648598030 实践 安装thrift brew install thriftthrift -version 编写thrift文件 新建文件夹thrift新建文件 结构体文件 Struct.thrift 服务文件 Service.…...

Maven:工程的拆分与聚合

Maven 拆分与聚合创建父工程创建子模块pom.xml配置示例拆分与聚合 在 Maven 中, 拆分是将一个完整的项目分成一个个独立的小模块,聚合是将各个模块进一步组合,形成一个完整的项目。接下来简单示例拆分与聚合的过程。 创建父工程 父工程,一个pom工程,目录结构简单,只需有…...

使用uniapp创建小程序和H5界面

uniapp的介绍可以看官网&#xff0c;接下来我们使用uniapp创建小程序和H5界面&#xff0c;其他小程序也是可以的&#xff0c;只演示创建这2个&#xff0c;其实都是一套代码&#xff0c;只是生成的方式不一样而已。 uni-app官网 1.打开HBuilder X 选择如图所示&#xff0c;下…...

密度峰值聚类算法(DPC)

密度峰值聚类算法目录DPC算法1.1 DPC算法的两个假设1.2 DPC算法的两个重要概念1.3 DPC算法的执行步骤1.4 DPC算法的优缺点matlab代码密度计算函数计算delta寻找聚类中心点聚类算法目录 DPC算法 1.1 DPC算法的两个假设 1&#xff09;类簇中心被类簇中其他密度较低的数据点包围…...

RabbitMQ相关问题

文章目录避免重复消费(保证消息幂等性)消息积压上线更多的消费者&#xff0c;进行正常消费惰性队列消息缓存延时队列RabbitMQ如何保证消息的有序性&#xff1f;RabbitMQ消息的可靠性、延时队列如何实现数据库与缓存数据一致&#xff1f;开启消费者多线程消费避免重复消费(保证消…...

操作系统 三(存储管理)

一、 存储系统的“金字塔”层次结构设计原理&#xff1a;cpu自身运算速度很快。内存、外存的访问速度受到限制各层次存储器的特点&#xff1a;1&#xff09;主存储器&#xff08;主存/内存/可执行存储器&#xff09;保存进程运行时的程序和数据&#xff0c;内存的访问速度远低于…...

day34 贪心算法 | 860、柠檬水找零 406、根据身高重建队列 452、用最少数量的箭引爆气球

题目 860、柠檬水找零 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。 顾客排队购买你的产品&#xff0c;&#xff08;按账单 bills 支付的顺序&#xff09;一次购买一杯。 每位顾客只买一杯柠檬水&#xff0c;然后向你付 5 美元、10 美元或 20 美元。你必须给每个…...

使用canvas给上传的整张图片添加平铺的水印

写在开头 哈喽&#xff0c;各位倔友们又见面了&#xff0c;本章我们继续来分享一个实用小技巧&#xff0c;给图片加水印功能&#xff0c;水印功能的目的是为了保护网站或作者版权&#xff0c;防止内容被别人利用或白嫖。 但是网络中&#xff0c;是没有绝对安全的&#xff0c;…...

[安装之4] 联想ThinkPad 加装固态硬盘教程

方案&#xff1a;保留原有的机械硬盘&#xff0c;再加装一个固态硬盘作为系统盘。由于X250没有光驱&#xff0c;这样就无法使用第二个2.5寸的硬盘。还好&#xff0c;X250留有一个M.2接口&#xff0c;这样&#xff0c;就可以使用NGFF M.2接口的固态硬盘。不过&#xff0c;这种接…...

Java数据类型、基本与引用数据类型区别、装箱与拆箱、a=a+b与a+=b区别

文章目录1.Java有哪些数据类型2.Java中引用数据类型有哪些&#xff0c;它们与基本数据类型有什么区别&#xff1f;3.Java中的自动装箱与拆箱4.为什么要有包装类型&#xff1f;5.aab与ab有什么区别吗?1.Java有哪些数据类型 8种基本数据类型&#xff1a; 6种数字类型(4个整数型…...

GoLang设置gofmt和goimports自动格式化

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

【k8s】如何搭建搭建k8s服务器集群(Kubernetes)

搭建k8s服务器集群 服务器搭建环境随手记 文章目录搭建k8s服务器集群前言&#xff1a;一、前期准备&#xff08;所有节点&#xff09;1.1所有节点&#xff0c;关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换&#xff0c;打通所有服务器网络&#xff0c;进行p…...

DIDL4_前向传播与反向传播(模型参数的更新)

前向传播与反向传播前向传播与反向传播的作用前向传播及公式前向传播范例反向传播及公式反向传播范例小结前向传播计算图前向传播与反向传播的作用 在训练神经网络时&#xff0c;前向传播和反向传播相互依赖。 对于前向传播&#xff0c;我们沿着依赖的方向遍历计算图并计算其路…...

链表学习之链表划分

链表解题技巧 额外的数据结构&#xff08;哈希表&#xff09;&#xff1b;快慢指针&#xff1b;虚拟头节点&#xff1b; 链表划分 将单向链表值划分为左边小、中间相等、右边大的形式。中间值为pivot划分值。 要求&#xff1a;调整之后节点的相对次序不变&#xff0c;时间复…...

(考研湖科大教书匠计算机网络)第五章传输层-第一、二节:传输层概述及端口号、复用分用等概念

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;传输层概述&#xff08;1&#xff09;概述&#xff08;2&#xff09;从计算机网络体系结构角度看传输层&#xff08;3&#xff09;传输层意义二&am…...

C#:Krypton控件使用方法详解(第七讲) ——kryptonHeader

今天介绍的Krypton控件中的kryptonHeader&#xff0c;下面开始介绍这个控件的属性&#xff1a;控件的样子如上图所示&#xff0c;从上面控件外观来看&#xff0c;这个控件有三部分组成。第一部分是前面的图片&#xff0c;第二部分是kryptonHeader1文本&#xff0c;第三部分是控…...

5年软件测试工程师分享的自动化测试经验,一定要看

今天给大家分享一个华为的软件测试工程师分享的关于自动化测试的经验及干货。真的后悔太晚找他要了&#xff0c; 纯干货。一定要看完&#xff01; 1.什么是自动化测试&#xff1f; 用程序测试程序&#xff0c;用代码取代思考&#xff0c;用脚本运行取代手工测试。自动化测试涵…...

什么是猜疑心理?小猫测试网科普小作文

什么是猜疑心理&#xff1f;猜疑心理是说一个人心中想法偏离了客观事实&#xff0c;牵强附会&#xff0c;往往是指不好的一面&#xff0c;对别人的一言一行都充满了不良的解读&#xff0c;认为这些对自己都有针对性&#xff0c;目的性&#xff0c;对自己都是不利的。猜疑心理重…...

做网站webform mvc/优化设计七年级上册数学答案

●MySQL事务隔离级别(1)●第1节:事务概述第2节:MySQL4种事务隔离级别分析第3节:总结1 事务概述什么是事务&#xff1f;数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。事务的使用是数据库管理系统区别文件系统的…...

重庆疫情新闻发布会/网站seo优化分析

SQL映射 SQL映射文件 SQL映射xml文件是所有sql语句放置的地方&#xff0c;不同于JDBC连接的方法&#xff0c;需要构造方法&#xff0c;写statement和resultset语句才可以调用指定的sql语句&#xff0c;只需要把所有的sql语句写在配置文件中&#xff0c;根据不同的id&#xff0c…...

python自动写wordpress/免费网站alexa排名查询

2019年10月31日&#xff0c;奇安信CERT监测到安全研究人员_S00pY将Solr通过Velocity模板代码执行任意命令漏洞的POC放到了Github。经研判&#xff0c;该POC对Solr的多个版本有效&#xff0c;且Apache Solr官方并未发布该漏洞的补丁。不过此漏洞在默认配置下无法利用。建议受影响…...

福州官网网站建设/搜狗收录入口

在HTML界面开发中&#xff0c;经常会遇见JS对TABLE表格的操作&#xff0c;下面针对几种经常性的操作进行汇总&#xff1a; 第一&#xff1a;JS动态增加表格行数据 在body中定义一个空的Table <div id"detail" class"sub-title4" align"left"…...

网站描述代码/怎么做app推广

福利资料见文末&#xff01; 监控redis通过info信息来监控redis的状态 自动发现脚本编写 cat /etc/zabbix/scripts/redis_parameter #自动发现redis脚本参数的脚本 #!/bin/bash /usr/local/bin/redis-cli -p 3000 -a redis66cs "info">/home/zabbix/tmp/info.tx…...

建设规划许可证公示网站/创建网站的流程是什么

经常使用今日头条、网易新闻的同学们应该都会注意到用于管理多个频道的可拖动排序GridView&#xff0c;下面介绍一下可拖动的DragGridView的实现方法。代码放在GitHub上https://github.com/zhaoyu87/DragGridView&#xff0c;需要的同学可以下载 DragGridView继承自GridView&am…...