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

yizhihongxing

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日

相关文章

  • Java8语法糖之Lambda表达式的深入讲解

    Java8语法糖之Lambda表达式的深入讲解 什么是Lambda表达式 Lambda表达式是Java8引入的一种新特性,它是一种匿名函数,可以用来简洁地表示某种行为,简化代码的编写。 Lambda表达式通常由参数列表、箭头符号和函数体组成。参数列表指定了传入该Lambda表达式的变量;箭头符号表示Lambda表达式的执行方向;函数体包含了Lambda表达式…

    Java 2023年5月26日
    00
  • 详解使用Spring Security进行自动登录验证

    使用Spring Security进行自动登录验证可以分为以下几个步骤: 1、添加Spring Security依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.security</groupId> <artifactId>sprin…

    Java 2023年5月20日
    00
  • Java中的数组基础知识学习教程

    Java中的数组基础知识学习教程 什么是数组 数组是一种可以存储多个同类型元素的容器。在Java中,数组分为一维数组和多维数组。一维数组可以看作是含有一行元素的表格,多维数组则可以看作是含有多行多列的表格。 如何声明数组 Java中声明数组需要指定数组类型、数组名和数组长度。声明语法如下: 数组类型[] 数组名 = new 数组类型[数组长度]; 比如声明一…

    Java 2023年5月26日
    00
  • Java基础之FastJson详解

    Java基础之FastJson详解 FastJson是一个Java语言编写的轻量级JSON解析工具,具有解析速度快、易用性好等优点。本文将从以下几个方面详细讲解FastJson的使用: 导入FastJson依赖 基本用法 使用注解进行自定义序列化与反序列化 高级特性 导入FastJson依赖 在使用FastJson之前,我们需要在项目中导入FastJson依…

    Java 2023年5月26日
    00
  • 教你如何在 javadoc 输出<> 符号

    当我们在撰写Java API文档时,有些类和方法的描述中可能涉及到尖括号(<和>)等特殊符号,但是当这些符号在javadoc中直接显示时会被解析为html标签,导致javadoc的显示不正常,影响使用。那么,如何在javadoc中输出这些特殊符号呢?下面是详细攻略: 1. 使用html实体字符 可以使用html实体字符来替代尖括号,其中大于号可用…

    Java 2023年5月26日
    00
  • java打印菱形及直角和等腰三角形的方法

    下面是“java打印菱形及直角和等腰三角形的方法”的完整攻略。 打印等腰三角形 等腰三角形的特点是两边相等,可以用两层循环实现。外层循环控制行数,内层循环控制每行的打印字符数量。 示例一: public class Triangle { public static void main(String[] args) { int n = 5; for (int …

    Java 2023年5月26日
    00
  • java实现简易聊天功能

    Java实现简易聊天功能攻略 1. 确定技术栈 要实现简易聊天功能,需要选择合适的技术栈。Java语言比较适合网络编程,因此可以先选择Java语言作为开发语言。 对于通信协议,可以选择TCP或UDP。TCP是一种可靠传输协议,通过三次握手建立连接,确保数据的可靠性。UDP则是一种不可靠传输协议,不进行连接建立,发送数据时没有确认机制。 对于GUI界面,可以使…

    Java 2023年5月19日
    00
  • Java杂谈之类和对象 封装 构造方法以及代码块详解

    Java杂谈之类和对象 封装 构造方法以及代码块详解 类和对象 Java是面向对象编程的语言,类是Java强大的概念之一。类是一组字段和方法的集合,用于表示某些相关的状态和行为。 在Java中,对象是类的实例。对象是通过类构造函数创建的,类构造函数定义了如何创建对象。按照惯例,类名应该以大写字母开头。 在Java中,类可以有任意数量的方法和成员,这些方法和成…

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