数据结构与算法之深度优先算法详解

news/2024/7/20 21:11:00 标签: 算法, 深度优先, 数据结构

深度优先算法(Depth First Search,DFS)是一种常见的图形算法,它是一种用于遍历或搜索树或图的算法。在深度优先搜索中,我们首先探索一个子树的深度,然后再回溯到父节点,接着探索另一个子树的深度,直至搜索结束。

深度优先算法的基本思想是沿着树的深度遍历树的节点。深度优先算法的工作原理类似于树的前序遍历,即首先访问根节点,然后依次访问该节点的子节点。

深度优先算法可以用递归实现,也可以使用栈来实现。下面我们详细介绍这两种实现方式。

  1. 递归实现深度优先算法

下面是使用递归实现深度优先算法的示例代码:

void dfs(int node, vector &visited, vector> &graph) {
    // 标记节点node已被访问
    visited[node] = true;
    // 访问节点node
    cout << node << " ";
    // 遍历node的所有邻居节点
    for (int i = 0; i < graph[node].size(); i++) {
        int neighbor = graph[node][i];
        // 如果邻居节点未被访问,则递归访问它
        if (!visited[neighbor]) {
            dfs(neighbor, visited, graph);
        }
    }
}

在这个示例中,我们首先定义一个函数dfs,它接收三个参数,分别是当前节点node、表示节点是否被访问的visited向量以及描绘图的邻接矩阵graph。在函数内部,我们首先将当前节点标记为已访问,并输出该节点的编号。然后我们遍历该节点的所有邻居节点,如果邻居节点未被访问,则递归地访问它。递归的终止条件是遍历完所有节点。

  1. 栈实现深度优先算法

下面是使用栈实现深度优先算法的示例代码:

void dfs(int node, vector &visited, vector> &graph) {
    stack stk;
    // 将起始节点入栈
    stk.push(node);
    while (!stk.empty()) {
        // 取出栈顶元素
        int cur = stk.top();
        stk.pop();
        // 如果当前节点未被访问,则访问它
        if (!visited[cur]) {
            visited[cur] = true;
            cout << cur << " ";
            // 将当前节点的邻居节点入栈
            for (int i = graph[cur].size() - 1; i >= 0; i--) {
                int neighbor = graph[cur][i];
                if (!visited[neighbor]) {
                    stk.push(neighbor);
                }
            }
        }
    }
}

在这个示例中,我们首先定义一个函数dfs,它接收三个参数,分别是当前节点node、表示节点是否被访问的visited向量以及描绘图的邻接矩阵graph。在函数内部,我们创建一个栈,并将初始节点node入栈。在栈未空之前,我们重复执行以下步骤:

  • 取出栈顶元素
  • 如果当前节点未被访问,则将其标记为已访问,并输出该节点的编号
  • 遍历该节点的所有邻居节点,如果邻居节点未被访问,则将其入栈

在程序的最后,我们完成了整个深度优先遍历。

深度优先算法的时间复杂度为$O(V+E)$,其中$V$是图的节点数量,$E$是图的边数量。因为在遍历每个节点和边的时候,每个节点和边都会被访问一次。另外,深度优先算法的空间复杂度为$O(V)$,其中$V$是图的节点数量,因为需要存储每个节点的访问状态。


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

相关文章

鉴权管理系统(JWT技术架构)——SpringBoot2+Vue2(一定惊喜满满,万字长文)

初衷&#xff1a; 一直不太理解整个前后端的鉴权&#xff0c;跨域等问题&#xff0c;抽空两个晚上整理出万字文章&#xff0c;也是对于自己的一个交代&#xff0c;现在共享出来&#xff0c;希望大家也能受益&#xff0c;将使用过程在这里一一详述&#xff0c;还是多说一句&…

Dubbo基础

1、分布式简要说明 Dubbo是用于分布式系统的框架所以我们要先了解什么是分布式 分布式系统是若干独立计算机的集合&#xff0c;这些计算机对于用户来说就像单个相关系统。 老式系统(单一应用架构)就是把一个系统&#xff0c;统一放到一个服务器当中然后每一个服务器上放一个系…

springCloud使用maven

springCloud项目使用maven集成nexus 一&#xff1a;故事背景二&#xff1a;基础概念2.1 什么是Maven2.2 什么是nexus 三&#xff1a;实操3.1 setting文件配置3.2 项目内pom.xml配置3.3 jar上传3.3.1 maven插件上传3.3.2 mvn命令上传3.3.3 页面上传3.3.4 通过Rest的方式进行上传…

软考高项论文范文(三)

论信息系统项目的沟通管理 【摘要】&#xff08;该摘要共313个字符&#xff09; 本文讨论了ⅹⅹ省社保系统民政统一软件开发项目的沟通管理。该项目是在国家大社会保险政策指导下于2018年10月份正式启动的。该系统为用户提供了优抚安置、救灾救济等十大主要业务功能。在本文中…

windows使用bat编写自启动带用户登录数据的浏览器

windows使用bat编写自启动崭新浏览器 本文是为了优化前文selenium&playwright指定浏览器操作&#xff0c;编写了一个bat单独运行。&#xff08;基于windows&#xff09; 这样使用这个工具的人员可以直接在自己电脑上双击bat后再双击exe就可以直接运行程序&#xff0c;无需…

【Scala---01】Scala 基础 『 变量和数据类型 | 控制语句 | 函数式编程』

文章目录 1. 变量和数据类型1.1 变量和常量1.2 字符串1.3 数据类型1.4 伴生对象与伴生类1.5 代码块1.6 Unit、null、Nothing1.7 强制转换1.8 与 equals 2. 控制语句2.1 分支语句2.2 循环语句&#xff08;1&#xff09;for循环&#xff08;2&#xff09;while/do-while循环&…

嘉兴桐乡海宁会计考证实操-零基础怎么学会计实操?

零基础怎么学会计实操&#xff1f; 零基础的学员想要从事会计工作但是自己缺不知道如何学习&#xff1f;毋庸置疑&#xff0c;肯定是要有初级理论知识会计实操技能&#xff0c;才能更好的从事会计工作&#xff01;但是单单有初级职称证书肯定是不够的&#xff0c;因为会计的…

27-Django项目实战(5)

1 歌曲搜索 音乐平台的每个网页顶部都设置了歌曲搜索功能&#xff0c;歌曲搜索框以网页表单的形式展示&#xff0c;并且以POST请求方式实现歌曲搜索功能&#xff0c;搜索结果显示在歌曲搜索页。歌曲搜索页由项目应用search实现&#xff0c;首先在search的urls.py中定义路由sea…