4.3 BFS

category
type
status
slug
date
summary
tags
password
icon
永远不要说永远,总有一些事情是可能的。
— 《放牛班的春天》
🏰代码及环境配置:请参考 环境配置和代码运行!

广度优先搜索(Breadth-First Search,简称BFS)是一种用于遍历或搜索树或图的算法。该算法从一个节点开始,先访问这个节点的所有邻接节点,然后再依次访问这些邻接节点的未被访问的邻接节点,以此类推,直到访问完所有可达的节点。它适用于无向图和有向图。

4.3.1 数据结构-队列

队列是一种先进先出(FIFO)的容器,如下图:
notion image

4.3.2 BFS算法的实现

使用BFS算法找寻路径的实现步骤如下:
  1. 初始化
      • 创建一个队列Q,用于存储待访问的节点。
      • 创建一个数组visited,用于标记已访问过的节点。
      • 将起始节点放入队列,并标记为已访问。
  1. 循环遍历
      • 当队列不为空时,执行以下操作:
        • 从队列中弹出(或称为“出队”)一个节点,记为v ,若节点v 就是目标节点goal ,则提前返回。
        • 访问节点v的所有未访问的邻接节点。
        • 对于每个未访问的邻接节点,将其加入队列,并标记为已访问,同时记录当前节点v为邻接节点的父节点。
  1. 回溯路径
      • 从目标节点开始,通过父节点向回追溯,直到起始节点,最终得到一条路径。
其伪代码如下:

4.3.3 BFS算法的图解

以从下面的无权图中找到从节点0 到节点4 的最短路径为例,说明一下BFS算法的工作流程:
notion image
  1. 初始化一个空的队列和一个空的数组,其中队列用来存储未被访问过的节点,数组用来存储节点是否被访问过。
    1. notion image
  1. 将节点0 放入队列,并将其标记为已访问。
    1. notion image
  1. 从队列头部移除节点0 ,并将其未被访问过的邻接节点(12)放入队列,邻接节点(12)的父节点是0
    1. notion image
  1. 从队列头部移除节点1 ,并将其未被访问过的邻接节点(3)放入队列,邻接节点(3)的父节点是1
    1. notion image
  1. 从队列头部移除节点2 ,并将其未被访问过的邻接节点(4)放入队列,邻接节点(4)的父节点是2
    1. notion image
  1. 从队列头部移除节点3 ,并将其未被访问过的邻接节点(无)放入队列。
    1. notion image
  1. 从队列头部移除节点4 ,节点4 即为目标节点,BFS算法遍历结束,并通过回溯父节点找到一条路径(0 —> 2—> 4)。
notion image

4.3.4 BFS算法特点

  • 优点
    • 可以找到从起点到终点的最短路径(在无权图中)。
    • 实现简单,易于理解和实现。
  • 缺点
    • 需要较多的存储空间来保存待访问的节点(使用队列)。
    • 在有权图中,BFS不一定能找到最短路径(因为BFS只考虑路径上的边数,而不考虑边的权重)。

4.3.5 参考

上一篇
动手学控制理论
下一篇
端到端-理论与实战视频课程
Loading...