Java 广度优先搜索(Breadth-First Search,BFS)

广度优先搜索

遍历意味着访问图的所有节点。广度优先遍历或广度优先搜索是一种用于搜索图或树数据结构的所有顶点的递归算法。


广度优先搜索算法

标准 BFS 实现将图的每个顶点归入以下两个类别之一:

  1. 访问过
  2. 未访问过

该算法的目的是将每个顶点标记为已访问,同时避免循环。

该算法的工作原理如下:

  1. 首先将图的任意一个顶点放在队列的后面。
  2. 取出队列的最前面的项目并将其添加到访问列表中。
  3. 创建该顶点的相邻节点的列表。将不在访问列表中的添加到队列的后面。
  4. 继续重复步骤 2 和 3,直到队列为空。

该图可能有两个不同的断开部分,因此为了确保覆盖每个顶点,我们还可以在每个节点上运行 BFS 算法


广度优先搜索示例

让我们通过一个例子来看看广度优先搜索算法是如何工作的。我们使用具有 5 个顶点的无向图。

具有 5 个顶点的无向图

具有 5 个顶点的无向图

我们从顶点 0 开始,BFS 算法首先将其放入 Visited 列表中,并将其所有相邻顶点放入堆栈中。

访问起始顶点并将其相邻顶点添加到队列中

访问起始顶点并将其相邻顶点添加到队列中

接下来,我们访问队列前面的元素(即 1)并访问其相邻节点。由于 0 已经被访问过,所以我们访问 2。

访问起始节点0的第一个邻居,即1

访问起始节点0的第一个邻居,即1

顶点 2 在 4 中有一个未访问的相邻顶点,因此我们将其添加到队列的后面并访问位于队列前面的 3。

访问之前添加到队列中的 2 以添加其邻居

访问之前添加到队列中的 2 以添加其邻居

访问

4 仍在队列中

队列中只剩下 4 个节点,因为 3 的唯一相邻节点(即 0)已经被访问过。我们参观它。

访问队列中最后剩余的项目以检查它是否有未访问的邻居

访问队列中最后剩余的项目以检查它是否有未访问的邻居

由于队列为空,我们就完成了图的广度优先遍历。

广度优先搜索伪代码 

create a queue Q 
mark v as visited and put v into Q 
while Q is non-empty 
    remove the head u of Q 
    mark and enqueue all (unvisited) neighbours of u 

广度优先搜索算法的代码及其示例如下所示。代码已被简化,以便我们可以专注于算法而不是其他细节。 

// BFS algorithm in Java

import java.util.*;

public class Graph {
  private int V;
  private LinkedList<Integer> adj[];

  // Create a graph
  Graph(int v) {
    V = v;
    adj = new LinkedList[v];
    for (int i = 0; i < v; ++i)
      adj[i] = new LinkedList();
  }

  // Add edges to the graph
  void addEdge(int v, int w) {
    adj[v].add(w);
  }

  // BFS algorithm
  void BFS(int s) {

    boolean visited[] = new boolean[V];

    LinkedList<Integer> queue = new LinkedList();

    visited[s] = true;
    queue.add(s);

    while (queue.size() != 0) {
      s = queue.poll();
      System.out.print(s + " ");

      Iterator<Integer> i = adj[s].listIterator();
      while (i.hasNext()) {
        int n = i.next();
        if (!visited[n]) {
          visited[n] = true;
          queue.add(n);
        }
      }
    }
  }

  public static void main(String args[]) {
    Graph g = new Graph(4);

    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(2, 0);
    g.addEdge(2, 3);
    g.addEdge(3, 3);

    System.out.println("Following is Breadth First Traversal " + "(starting from vertex 2)");

    g.BFS(2);
  }
}

BFS算法复杂度
BFS算法的时间复杂度用 的形式表示O(V + E),其中V是节点数,E 是边数。

该算法的空间复杂度为O(V)。

BFS算法应用
1、通过搜索索引建立索引
2、用于 GPS 导航
3、路径寻找算法
4、在 Ford-Fulkerson 算法中找到网络中的最大流量
5、无向图中的循环检测
6、在最小生成树中

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值