图的遍历算法——BFS和DFS

news/2024/7/20 22:02:57 标签: 深度优先, 算法, 宽度优先

一、前言

在计算机科学领域,图是一种非常重要的数据结构。图是由节点和边构成的,节点之间的关系通过边来表示。图的遍历是对图进行搜索的过程,可以帮助我们找到图中的所有节点和边。

在本文中,我们将介绍两种常见的图遍历算法——BFS和DFS。BFS(广度优先搜索)是一种广度优先搜索算法,DFS(深度优先搜索)是一种深度优先搜索算法。这两种算法都可以用来遍历图中的所有节点和边,但它们的搜索方式不同。

二、BFS算法

BFS算法是一种广度优先搜索算法,它从图的起始节点开始遍历,逐层扩展搜索范围,直到找到目标节点为止。BFS算法使用队列来存储待搜索的节点,先进先出的原则确保了搜索的广度优先。

2.1 算法思路

BFS算法的基本思路如下:

  1. 将起始节点放入队列中,并将其标记为已访问。
  2. 从队列中取出一个节点,访问它的所有未访问过的邻居节点,并将它们放入队列中。
  3. 重复步骤2,直到队列为空。

2.2 代码实现

下面是BFS算法的Java代码实现:

public class Code01_BFS {
  /**
     * BFS算法
     * @param start 起始节点
     */
    public static void bfs(Node start) {
        if (start == null) {
            return;
        }
        Queue<Node> queue = new LinkedList<>();
        Set<Node> set = new HashSet<>();
        queue.add(start);
        set.add(start);
        while (!queue.isEmpty()) {
            Node cur = queue.poll();
            System.out.println(cur.value);
            for (Node next : cur.nexts) {
                if (!set.contains(next)) {
                    set.add(next);
                    queue.add(next);
                }
            }
        }
    }
}

三、DFS算法

DFS算法是一种深度优先搜索算法,它从图的起始节点开始遍历,一直走到最深处,直到找到目标节点为止。DFS算法使用栈来存储待搜索的节点,后进先出的原则确保了搜索的深度优先

3.1 算法思路

DFS算法的基本思路如下:

  1. 将起始节点压入栈中,并将其标记为已访问。
  2. 从栈中弹出一个节点,访问它的所有未访问过的邻居节点,并将它们压入栈中。
  3. 重复步骤2,直到栈为空。

3.2 代码实现

下面是DFS算法的Java代码实现:

public class Code02_DFS {
 /**
     * DFS算法
     * @param node 起始节点
     */
    public static void dfs(Node node) {
        if (node == null) {
            return;
        }
        Stack<Node> stack = new Stack<>();
        HashSet<Node> set = new HashSet<>();
        stack.add(node);
        set.add(node);
        while (!stack.isEmpty()) {
            Node cur = stack.pop();
            for (Node next : cur.nexts) {
                if (!set.contains(next)) {
                    stack.push(cur);
                    stack.push(next);
                    set.add(next);
                    System.out.println(next.value);
                    break;
                }
            }
        }
    }
}

四、总结

本文介绍了两种常见的图遍历算法——BFS和DFS。BFS算法使用队列来存储待搜索的节点,先进先出的原则确保了搜索的广度优先;DFS算法使用栈来存储待搜索的节点,后进先出的原则确保了搜索的深度优先。这两种算法都可以用来遍历图中的所有节点和边,具体使用哪种算法取决于具体的问题和需求。

希望本文能够帮助大家更好地理解图的遍历算法


http://www.niftyadmin.cn/n/5054638.html

相关文章

更好的用户体验, 开源实时监控新版发布

哈喽大家好&#xff0c;时间很快两个月又过去了&#xff0c;HertzBeat 经过近两个月的迭代终于发布了 v1.4.1 版本。为什么是终于&#xff0c;因为有点难哈哈。我们参考 rocketmq 重构了 netty 的 server client 端模块&#xff0c;重构了采集器集群调度。比起上一版本有了更优…

手机能搜到某个wifi,电脑搜不到解决方法(也许有用)

方法一&#xff1a;更新驱动 下载驱动大师、驱动精灵等等驱动软件&#xff0c;更新网卡驱动 方法二 按 win 键&#xff0c;打开菜单 搜索 查看网络连接&#xff08;win11版本是搜这个名字&#xff09; 点击打开是这样式的 然后对 WLAN右击->属性->配置->高级 这…

比特币上的可验证延迟函数

可验证延迟函数 (VDF) 是一种需要大量 顺序计算 来评估但可以快速验证的函数。我们首次在比特币上实现了它。VDF 作为密码学技术可用于构建大量新应用程序&#xff0c;例如公共随机信标、计算时间戳和数据复制证明。 VDF 场景 链上随机信标 在区块链中很难实现随机性&#xf…

走心分享!天津诚筑说Java大数据培训我该如何选择?

随着互联网的发展&#xff0c;IT行业变得越来越炙手可热&#xff0c;其中较为火热的当属大数据和Java了&#xff0c;许多学员都很纠结&#xff0c;Java和大数据我应该如何选择呢?今天小编带大家了解一下Java和大数据之间的区别&#xff01; Java和大数据的关系 Java是一种面…

2024年【MCM/ICM】美国大学生数学建模竞赛优秀论文(免费下载)

一、前言 美国大学生数学建模竞赛&#xff08;MCM/ICM&#xff09;由美国数学及其应用联合会主办&#xff0c;是最高的国际性数学建模竞赛&#xff0c;也是世界范围内最具影响力的数学建模竞赛&#xff0c;一般也指数学建模竞赛。赛题内容涉及经济、管理、环境、资源、生态、医…

postman接口测试系列: 时间戳和加密

在使用postman进行接口测试的时候&#xff0c;对于有些接口字段需要时间戳加密&#xff0c;这个时候我们就遇到2个问题&#xff0c;其一是接口中的时间戳如何得到&#xff1f;其二就是对于现在常用的md5加密操作如何在postman中使用代码实现呢&#xff1f; 下面我们以一个具体的…

文件的随机读写函数:fseek

目录 函数介绍&#xff1a; fseek&#xff1a; 原型&#xff1a; 参数说明&#xff1a; int origin&#xff1a; 举例&#xff1a; 文件内容展示&#xff1a; 正常的使用fgetc函数&#xff1a; 结果&#xff1a; 使用了fseek之后&#xff1a; SEEK_SET :从开始位置进行…

vue3相比vue2的优点

一、响应式&#xff1a; &#xff08;1&#xff09;vue2&#xff1a;内置的Object.defineProperty将data中的数据转化成响应式数据的&#xff0c;它会将data中的每个属性都转换为具有getter和setter的响应式属性 Object.defineProperty是一个内置的方法&#xff0c;它用于定义…