蓝桥强化宝典(3)BFS

一、定义

广度优先搜索(Breadth-First Search, BFS)是另一种用于遍历或搜索树或图的算法。与深度优先搜索(DFS)沿着树的深度遍历不同,广度优先搜索会逐层遍历图的顶点。它从一个指定的源顶点开始,首先访问这个顶点的所有直接邻接点,然后对这些邻接点进行同样的操作,即访问它们的未被访问的邻接点,以此类推,直到访问完图中所有可达的顶点。

二、基本思想

  1. 访问源顶点:从指定的源顶点开始访问。
  2. 访问邻接点:将源顶点的所有未被访问的邻接点加入到一个队列中。
  3. 逐层遍历:从队列中取出一个顶点,访问它,并将其所有未被访问的邻接点加入队列中。这个过程一直持续到队列为空,即所有可达的顶点都被访问过。

三、实现方式

  • 队列:使用队列来存储待访问的顶点。在BFS过程中,队列起到了关键作用,它确保了顶点按照它们被发现的顺序(即广度优先的顺序)被访问。

四、应用

  • 最短路径问题:在无权图中,BFS可以用来找到从源顶点到其他所有顶点的最短路径(路径长度为边的数量)。
  • 层次遍历:在树(可以视为图的特例)中,BFS可以实现层次遍历,即按从上到下、从左到右的顺序访问树的节点。
  • 网络爬虫:在网页搜索中,BFS可以用来实现广度优先的网页抓取策略。
  • 图的连通性:BFS可以用来检查图是否是连通的,或者找出图中的所有连通分量。

五、伪代码

plaintext复制代码

|---|--------------------|
| | BFS(s): |
| | 创建一个队列Q |
| | 将顶点s加入队列Q |
| | 标记s为已访问 |
| | |
| | 当Q非空时 |
| | 从Q中取出一个顶点v |
| | 对于v的每个未被访问的邻接点w |
| | 将w加入队列Q |
| | 标记w为已访问 |
| | |
| | 主函数: |
| | 对于图中的每个顶点u |
| | 如果u未被访问 |
| | BFS(u) |

注意:在上面的伪代码中,主函数中的循环实际上是不必要的,因为BFS本身就会遍历从源顶点可达的所有顶点。但是,如果你想要从多个源顶点开始搜索,或者想要确保图中的所有顶点都被访问(即使它们是孤立的),那么主函数中的循环就是必要的。然而,在大多数情况下,我们只需要从一个源顶点开始搜索,并允许BFS遍历所有可达的顶点。

六、注意事项

  • BFS需要额外的空间来存储队列中的顶点,这可能会增加算法的空间复杂度。
  • BFS的性能也依赖于图的结构和实现的细节。在某些情况下,对于稀疏图,使用邻接表来表示图可能会更高效;而对于密集图,使用邻接矩阵可能更合适。
  • BFS是稳定的,即它会按照顶点被发现的顺序来访问它们,这在某些应用中是非常重要的。

结语

智者一切求自己

愚者一切求他人

!!!

相关推荐
大明者省20 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_79821 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2581 天前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记1 天前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI1 天前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型1 天前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光1 天前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院1 天前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡1 天前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
杨石兴1 天前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学