Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法

Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法

深度优先搜索(DFS)和广度优先搜索(BFS)算法是常用的遍历和搜索算法,具有很高的实用价值。在Java中,我们可以通过使用递归函数和队列这两种数据结构来实现这两种算法。下面将对这两种算法进行详细的讲解。

深度优先搜索(DFS)

深度优先搜索(DFS)是一种常用的遍历算法,其思想就是从起点开始,先遍历尽可能深的节点,直到不能再遍历为止,然后回溯到上一个未遍历的节点。在实现中,我们可以使用递归函数来实现DFS算法。

public class DFS {

    public static void dfs(int[][] graph, int start, boolean[] visited) {

        visited[start] = true;  //将当前节点标记为已访问

        System.out.print(start + " "); //输出当前节点

        for (int i = 0; i < graph.length; i++) {
            if (graph[start][i] == 1 && !visited[i]) {  //如果当前节点与下一个节点有相邻关系并且下一个节点未被访问过
                dfs(graph, i, visited); //递归访问下一个节点
            }
        }
    }

    public static void main(String[] args) {
        int[][] graph = {
                {0, 1, 1, 0, 0, 0},
                {1, 0, 0, 1, 1, 0},
                {1, 0, 0, 0, 0, 1},
                {0, 1, 0, 0, 1, 0},
                {0, 1, 0, 1, 0, 0},
                {0, 0, 1, 0, 0, 0}
        };

        boolean[] visited = new boolean[graph.length];
        Arrays.fill(visited, false);

        dfs(graph, 0, visited);
    }
}

以上代码中,我使用邻接矩阵来表示图,其中的dfs方法用于递归遍历节点,visited数组用于记录节点是否已经被访问过。

示例1:通过上述代码遍历如下图所示的图

    0 -- 1 -- 3
    |    |    |
    2    4    5

输出结果:0 1 3 4 5 2

广度优先搜索(BFS)

广度优先搜索(BFS)是一种常用的遍历算法,其思想是从起点开始,先遍历所有的相邻节点,然后再遍历相邻节点的相邻节点,直到遍历完所有的节点。在实现中,我们可以使用队列这种数据结构来实现BFS算法。

import java.util.*;

public class BFS {

    public static void bfs(int[][] graph, int start, boolean[] visited) {
        Queue<Integer> queue = new LinkedList<>();

        visited[start] = true; //将当前节点标记为已访问
        queue.offer(start); //将当前节点加入队列

        while (!queue.isEmpty()) { //只要队列中还有节点
            int node = queue.poll(); //弹出队列中的节点
            System.out.print(node + " "); //输出当前节点

            for (int i = 0; i < graph.length; i++) {
                if (graph[node][i] == 1 && !visited[i]) { //如果当前节点与下一个节点有相邻关系并且下一个节点未被访问过
                    visited[i] = true; //将下一个节点标记为已访问
                    queue.offer(i); //将下一个节点加入队列
                }
            }
        }
    }

    public static void main(String[] args) {
        int[][] graph = {
                {0, 1, 1, 0, 0, 0},
                {1, 0, 0, 1, 1, 0},
                {1, 0, 0, 0, 0, 1},
                {0, 1, 0, 0, 1, 0},
                {0, 1, 0, 1, 0, 0},
                {0, 0, 1, 0, 0, 0}
        };

        boolean[] visited = new boolean[graph.length];
        Arrays.fill(visited, false);

        bfs(graph, 0, visited);
    }
}

以上代码中,我使用邻接矩阵来表示图,其中的bfs方法用于遍历节点,visited数组用于记录节点是否已经被访问过。

示例2:通过上述代码遍历如下图所示的图

    0 -- 1 -- 3
    |    |    |
    2    4    5

输出结果:0 1 2 3 4 5

通过上述两个示例,我们可以看到DFS和BFS算法具有不同的遍历方式,在不同的问题中,我们可以根据具体情况选择正确的遍历算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java的DataInputStream和DataOutputStream数据输入输出流

    DataInputStream和DataOutputStream是Java中常用的数据输入输出流,它们提供了一种用于串行化和反串行化基本java数据类型的方法。在处理二进制数据时,这两个类可以很好的对数据进行读和写操作。下面就来详细讲解这两个输入输出流的使用。 DataInputStream DataInputStream是一种基于字节流的数据输入流。在使用…

    Java 2023年5月26日
    00
  • java中lambda表达式语法说明

    下面为你详细讲解Java中lambda表达式的语法和使用方法。 Lambda表达式语法说明 Lambda表达式是Java 8加入的一个新特性,用于简洁明了地描述一个函数式接口(Functional Interface)。Lambda表达式通常包含两部分: 参数列表:可以是无参数,也可以是有参数。如果有参数,参数类型可以显式地声明,也可以由编译器自行推断。 代…

    Java 2023年5月26日
    00
  • java10下编译lombok注解代码分享

    为了在Java 10环境下编译Lombok注解代码,我们需要遵循以下步骤: 1.安装Lombok 可以通过Maven或Gradle依赖来安装Lombok。我们在Maven项目中添加以下依赖: <dependency> <groupId>org.projectlombok</groupId> <artifactId&g…

    Java 2023年5月20日
    00
  • hystrix配置中Apollo与Archaius对比分析

    下面是关于“hystrix配置中Apollo与Archaius对比分析”的完整攻略。 1. 什么是Hystrix Hystrix是一个库,用于隔离远程系统,服务或第三方库,防止它们故障并使自己的应用程序保持连续性,并实现弹性、弹性、监控和回退机制。 2. Hystrix中的配置管理 在Hystrix中,除了默认的配置外,大多数配置都可以在运行时进行更改。Hy…

    Java 2023年6月15日
    00
  • SpringBoot与spring security的结合的示例

    首先,Spring Security 是基于 Spring 框架的安全模块,可以帮助开发者为 Web 应用程序提供安全认证和授权功能。而 Spring Boot 是基于 Spring 框架的快速开发应用程序的框架。结合两者,可以快速搭建安全可靠的 Web 应用。下面,将详细讲解结合的示例: 环境准备 首先,需要准备好以下环境: JDK 8 或 11 Mave…

    Java 2023年5月20日
    00
  • 基于Java的Scoket编程

    下面我将为你详细讲解“基于Java的Socket编程”的完整攻略。 Socket编程简介 Socket编程是指利用Socket套接字来进行网络通信的一种编程方式。在这种编程方式中,一个程序可以充当客户端与远程服务器进行通信,也可以充当服务器同时与多个客户端进行通信。 Socket编程流程 Socket编程的一般流程如下: 创建Socket对象,指定连接的服务…

    Java 2023年5月24日
    00
  • IDEA配置Maven并版本统一管理的实现

    下面就为大家详细讲解 “IDEA配置Maven并版本统一管理的实现” 的攻略。 1. 配置Maven 1.1 下载安装Maven 首先,在官网下载最新的Maven,并且按照安装提示进行安装。 1.2 配置IDEA 打开IDEA,进行如下的配置: 点击菜单栏的 File -> Settings(或直接使用快捷键 Ctrl + Alt + S )打开设置界…

    Java 2023年5月19日
    00
  • Java进阶学习:jar打包详解

    Java进阶学习:jar打包详解 什么是jar包? Java Archive文件,简称jar包,是Java中一种用于打包、压缩Java类文件、图片、配置文件等资源的标准格式。它能够将多个相关的Java类和其它文件捆绑成一个独立的可执行程序,方便部署和传输。 jar包可以用于多种场合,比如: 将代码打包成jar文件,以便分发代码,并方便其他程序调用 建立插件体…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部