欢迎访问宙启技术站
智能推送

如何使用Java函数进行BFS(广度优先搜索)

发布时间:2023-05-28 11:21:56

广度优先搜索(BFS)是一个用于图形搜索和遍历的算法,它从给定的起点开始,完成对整个图的遍历,并找到目标节点。BFS 用简单的队列数据结构来完成整个搜索过程,起始节点先入队,然后出队,进而扩展出所有相邻节点,将相邻节点加入队列,直到找到目标节点或者遍历完整张图。以下是使用 Java 函数进行 BFS 的步骤:

1. 创建一个 Queue 数据结构,在Java 库中可以使用 LinkedList 实现它:

Queue<Integer> queue = new LinkedList<>();

2. 创建一个 HashSet 数据结构来存储已访问的节点:

HashSet<Integer> visited = new HashSet<>();

3. 初始化起始节点,并将其添加到队列 queue 中,同时标记已访问:

int start = 0;
queue.add(start);
visited.add(start);

4. 在 while 循环中,每次在队列 queue 中出队首个节点,并处理该节点的所有相邻节点:

while(!queue.isEmpty()) {
    int cur = queue.poll();  // 出队首个节点
    for(int neighbor : getNeighbors(cur)) {  // 处理所有相邻节点
        if(!visited.contains(neighbor)) {  // 如果相邻节点未访问过,标记已访问并加入队列
            visited.add(neighbor);
            queue.add(neighbor);
        }
    }
}

5. 在找到目标节点时结束循环,返回结果:

if(cur == target) {
    // 找到了目标节点
    return target;
}

6. 如果整个图遍历结束后仍未找到目标节点,则说明目标节点不存在于此图中:

// 图中不存在目标节点
return -1;

完整的 Java 代码示例:

import java.util.*;

public class BFS {
    public static int bfs(int[][] graph, int start, int target) {
        Queue<Integer> queue = new LinkedList<>();         // 创建队列 Queue
        HashSet<Integer> visited = new HashSet<>();        // 创建 visited 集合

        queue.add(start);          // 添加起始节点
        visited.add(start);        // 标记已访问

        while(!queue.isEmpty()) {  // 循环处理队列中所有节点
            int cur = queue.poll();  // 出队首节点
            if(cur == target) {      // 找到目标节点
                return target;
            }
            for(int neighbor : graph[cur]) {   // 处理相邻节点
                if(!visited.contains(neighbor)) {  // 如果相邻节点未访问过,加入队列并标记已访问
                    visited.add(neighbor);
                    queue.add(neighbor);
                }
            }
        }

        return -1;  // 图中不存在目标节点
    }

    public static void main(String[] args) {
        // 图的邻接表表示
        int[][] graph = new int[][] {
            {1, 2},
            {0, 2, 3},
            {0, 1, 3},
            {1, 2}
        };

        int start = 0;    // 起始节点
        int target = 3;   // 目标节点

        int res = bfs(graph, start, target);     // 调用 BFS 算法

        System.out.println(res);    // 输出结果
    }
}

以上是使用 Java 函数进行 BFS 的步骤和代码示例,通过以上简单的示例程序,您可以轻松实现 BFS 算法,并找到任何所需的目标节点。