Java 中的 BFS 算法

2025年5月12日 | 阅读 5 分钟

什么是 BFS?

广度优先搜索 (BFS) 是一种用于遍历或搜索树或图数据结构的基本算法。通过将每个节点的邻居添加到从根节点开始的遍历队列中。图的 BFS 与树的 BFS 类似,不同之处在于图可能包含环。与深度优先搜索相比,在进行到下一级别之前,会先检查给定深度下的所有相邻节点。

它从树根(或图中的任意节点)开始,并在进入下一深度级别之前探索当前深度级别下的所有节点。BFS 广泛用于各种应用,例如网络爬虫、社交网络分析和网络中的最短路径问题。

BFS 算法

BFS 是一种迭代算法,它使用队列来跟踪下一步要探索的节点。以下是使用广度优先搜索来探索图所涉及的步骤:

  1. 获取图的邻接矩阵或邻接列表的数据。
  2. 创建一个队列并填充其中的项目。
  3. 激活根节点(意味着从队列开头获取根节点)。
  4. 从队列的头部(或初始元素)出队,然后从左到右将队列中的所有相邻节点入队。如果一个节点没有需要检查的相邻节点,则只需从队列中出队头部并继续操作。(注意:如果出现一个曾经检查过或已在队列中的邻居,则不要将其入队;相反,跳过它。)
  5. 一直这样做,直到队列为空。

BFS 应用

由于该算法的灵活性,广度优先搜索在现实世界中非常有用。其中一些是:

  1. 在点对点网络中,可以发现对等节点。大多数 BitTorrent 客户端,例如 BitTorrent、uTorrent 和 qBittorent,都使用此过程来查找网络中的“种子”和“对等方”。
  2. 在网络爬虫中使用图遍历技术构建索引。该过程以源页面作为根节点开始,然后向下遍历所有链接到源页面的二级页面(并且此过程将继续)。由于递归树的深度减小,广度优先搜索在此具有内在优势。
  3. 使用 GPS 导航系统,通过 GPS 进行广度优先搜索以查找附近的站点。
  4. Cheney 的技术,它采用了广度优先搜索的概念,用于垃圾回收。

BFS 遍历示例

首先,让我们来看一个简单的例子。我们将从 0 作为根节点开始,然后向下遍历图。

BFS Algorithm in Java

步骤 1:入队(0)

Queue

0

步骤 2:出队(0),入队(1),入队(3),入队(4)

Queue

134

步骤 3:出队(1),入队(2)

Queue

342

步骤 4:出队(3),入队(5)。由于 0 已经被检查过,我们不会再次将 1 加入队列。

Queue

425

步骤 5:出队(4)

Queue

25

步骤 6:出队(2)

Queue

5

步骤 7:出队(5)

Queue

现在队列为空,我们将停止该过程。

广度优先搜索 Java 程序

有几种处理代码的方法。我们将主要讨论在 Java 中实现广度优先搜索所涉及的步骤。可以使用邻接列表或邻接矩阵来存储图;任何一种方法都可以接受。在我们的代码中,将使用邻接列表来表示图。在实现 Java 中的广度优先搜索算法时,使用邻接列表会更容易,因为一旦将节点从队列的头部(或开始)出队,我们就只需要遍历连接到每个节点的节点列表一次。

用于演示代码的图将与上一个示例中使用的图相同。

BFSTraversal.java

输出

Breadth First Traversal for the graph is:
0 1 3 4 2 5

BFS 的实际用例

1. 无权图中的最短路径

BFS 的主要应用之一是查找无权图中的最短路径。由于 BFS 在进入下一级别之前会探索当前深度级别下的所有节点,因此它第一次遇到目标节点时,就找到了最短路径。

2. 网络爬虫

网络爬虫使用 BFS 从给定的 URL 开始遍历网页。爬虫会处理当前页面上的所有链接,然后再处理从那些页面找到的链接,有效地使用 BFS 来遍历网络图。

3. 社交网络分析

在社交网络中,BFS 可用于查找个人之间的最短路径(例如,分离度)。它还可以帮助识别距离给定用户特定“好友距离”的所有个人。

广度优先搜索是一种用途广泛的算法,在计算机科学中有广泛的应用。它能够逐级系统地探索节点,使其在查找无权图中的最短路径以及网络爬虫和社交网络分析等应用中特别有用。