Apollo学习笔记(21)图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

2023-11-06

首先奉上大神链接,https://www.cnblogs.com/qzhc/p/10291430.html。由于最近在看轨迹规划的资料,图遍历是基础,故拜读了大神的一些文章,在此记录。

深度优先遍历

深度优先遍历(Depth First Search)的主要思想是:

  1. 首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;

  2. 当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。

无向图的深度优先遍历图解

以下"无向图"为例:

在这里插入图片描述

对上无向图进行深度优先遍历,从A开始:

第1步:访问A。

第2步:访问B(A的邻接点)。 在第1步访问A之后,接下来应该访问的是A的邻接点,即"B,D,F"中的一个。但在本文的实现中,顶点ABCDEFGH是按照顺序存储,B在"D和F"的前面,因此,先访问B。

第3步:访问G(B的邻接点)。 和B相连只有"G"(A已经访问过了)

第4步:访问E(G的邻接点)。 在第3步访问了B的邻接点G之后,接下来应该访问G的邻接点,即"E和H"中一个(B已经被访问过,就不算在内)。而由于E在H之前,先访问E。

第5步:访问C(E的邻接点)。 和E相连只有"C"(G已经访问过了)。

第6步:访问D(C的邻接点)。

第7步:访问H。因为D没有未被访问的邻接点;因此,一直回溯到访问G的另一个邻接点H。

第8步:访问(H的邻接点)F。

因此访问顺序是:A -> B -> G -> E -> C -> D -> H -> F

有向图的深度优先遍历

有向图的深度优先遍历图解:

在这里插入图片描述

对上有向图进行深度优先遍历,从A开始:

第1步:访问A。

第2步:访问(A的出度对应的字母)B。 在第1步访问A之后,接下来应该访问的是A的出度对应字母,即"B,C,F"中的一个。但在本文的实现中,顶点ABCDEFGH是按照顺序存储,B在"C和F"的前面,因此,先访问B。

第3步:访问(B的出度对应的字母)F。 B的出度对应字母只有F。

第4步:访问H(F的出度对应的字母)。 F的出度对应字母只有H。

第5步:访问(H的出度对应的字母)G。

第6步:访问(G的出度对应字母)E。 在第5步访问G之后,接下来应该访问的是G的出度对应字母,即"B,C,E"中的一个。但在本文的实现中,顶点B已经访问了,由于C在E前面,所以先访问C。

第7步:访问(C的出度对应的字母)D。

第8步:访问(C的出度对应字母)D。 在第7步访问C之后,接下来应该访问的是C的出度对应字母,即"B,D"中的一个。但在本文的实现中,顶点B已经访问了,所以访问D。

第9步:访问E。D无出度,所以一直回溯到G对应的另一个出度E。

因此访问顺序是:A -> B -> F -> H -> G -> C -> D -> E

广度优先遍历

广度优先遍历(Depth First Search)的主要思想是:类似于树的层序遍历。

无向图的广度优先遍历图解

在这里插入图片描述
从A开始,有4个邻接点,“B,C,D,F”,这是第二层;
在分别从B,C,D,F开始找他们的邻接点,为第三层。以此类推。

在这里插入图片描述
因此访问顺序是:A -> B -> C -> D -> F -> G -> E -> H

有向图的广度优先遍历图解:

在这里插入图片描述

与无向图类似 。可以参考。
在这里插入图片描述
因此访问顺序是:A -> B -> C -> F -> D -> H -> E -> G

代码GitHub上应该有很多,我这里就不献丑了。这里补充一GitHub上项目

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apollo学习笔记(21)图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析 的相关文章

随机推荐

  • brew 安装 for Mac

    安装命令 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew install master install brew 官网 http brew sh 安装过程遇
  • 电子学会2022年09月青少年软件编程C语言等级考试试卷二级真题及(参考答案)

    编程题 共5题 共100分 1 统计误差范围内的数 考试题目 统计一个整数序列中与指定数字m误差范围小于等于X的数的个数 时间限制 5000 内存限制 65536 输入 输入包含三行 第一行为N 表示整数序列的长度 N lt 100 第二行
  • 代码静态扫描工具sonar介绍

    一 SonarQube整体介绍 SonarQube为静态代码检查工具 采用B S架构 帮助检查代码缺陷 改善代码质量 提高开发速度 通过插件形式 可以支持Java C C JavaScripe等等二十几种编程语言的代码质量管理与检测 通过客
  • 右值引用详解

    何谓右值 右值引用 右值引用与其他对比 右值引用与移动语义 右值引用与std move 移动语义与std move 移动语义注意事项 移动语义与swap 完美转发 何谓右值 一个最简单判断左值 右值的方式是 等号左边的值即左值 等号右边的值
  • 深度学习之浅见

    通常来说 大家认为深度学习的观点是Geoffrey Hinton在2006年提出的 这一算法提出之后 得到了迅速的发展 关于深度学习 zouxy09的专栏中有详细的介绍 Free Mind 的博文也很值得一读 本博文是我对深度学习的一点看法
  • VS Code Remote Development

    在Windows下编辑Linux代码 并且有Linux下的系统接口 第三方dep库的语法解析 代码提示 自动补全 跳转 用起来真香 困扰了Linux后台开发人员多年的难题终极解决方案 要求VS Code版本在1 35 1以上 1 安装远程开
  • 基础学习JavaScript 之 Array

    笔记文 Array JavaScript内置对象之一 由索引值来排序的数据集合 下面就列出了array上的方法 会改变自身的方法 copyWithin 在数组内部 将一段元素序列拷贝到另一段元素序列上 覆盖原有的值 fill 将数组中指定区
  • dc-9 靶机渗透学习

    信息收集 用nmap扫描当前网段 nmap sP 192 168 202 0 24 对靶机进行端口扫描 nmap A p v 192 168 202 148 访问靶机的80端口 进行框架识别 无框架的页面 尝试web服务漏洞 用dirsea
  • java数据结构-栈

    栈 1 栈的定义 栈 Stack 是只允许在一端进行插入或删除的线性表 首先栈是一种线性表 但限定这种线性表只能在某一端进行插入和删除操作 栈顶 Top 线性表允许进行插入删除的那一端 栈底 Bottom 固定的 不允许进行插入和删除的另一
  • VMware+CentOS7搭建私有云桌面服务

    VMware CentOS7搭建私有云桌面服务 1 安装VMware虚拟机工作台 官网下载安装包 版本 14 1 3 Pro 地址 https my vmware com en web vmware info slug desktop en
  • 详解从0开始的嵌入式学习路线,学什么、怎么学?

    嵌入式是个大筐 什么都可以往里面装 电子 机械 计算机 自动化 测控 通信 物联网 很多很多专业都和嵌入式沾边 硬件 驱动 操作系统 网络 应用 算法 很多同学越学越迷糊 越学越感觉什么也不会 首先要记住一句话 嵌入式学习奥义 先观其广 再
  • osgEarth的Rex引擎原理分析(五十八)osgEarth::ShaderFactory osgEarth::ShaderLoader关系

    目标 五十四 中的问题130 osgEarth ShaderFactory osgEarth ShaderLoader关系 ShaderFactory主要用来产生各个着色器阶段的main函数 一般用户不需要直接使用它 除非有特殊的定制需要
  • [CTF]抓住那只猫(XCTF 4th-WHCTF-2017)

    原作者 darkless 题目描述 抓住那只猫 思路 打开页面 有个输入框输入域名 输入baidu com进行测试 发现无任何回显 输入127 0 0 1进行测试 发现已经执行成功 执行的是一个ping命令 一开始想的应该是命令拼接执行 但
  • React18的useEffect会执行两次

    React18的useEffect会执行两次 一 执行两次的useEffect 二 React18 useEffect 新特性 如何应对 1 首先先了解一下 React 中 useEffect 执行的时机 2 怎么样才能让 Effect 执
  • 0101日志-运维-mysql

    1 错误日志 错误日志 Error Log 错误日志记录了MySQL引擎在运行过程中出现的错误和异常情况 这些错误可能包括启动和关闭问题 数据库崩溃 权限问题等 错误日志对于排查和解决MySQL引擎问题非常有帮助 改日志默认开启 默认存放目
  • 知识科普:什么是AGI?

    原文链接 最近ChatGPT大火 火到原来卖酒卖保险的人也都开始直播聊ChatGPT了 其中大家或多或少会提到一个词 AGI 看清楚不是GAI也不是AIGC 今天就和大家聊聊AGI是什么 AGI最近经常被提到 主要是因为ChatGPT的开发
  • 网络编程——TCP

    网络编程 TCP TCP编程 TCP是一种可靠的 基于连接的网络协议 它是面向字节流的 即从一个进程到另一个进程的二进制序列 一条TCP连接需要两个端点 这两个端点需要分别建立各自的套接字 通常一方用于发送请求和数据 称为客户端 另一方用于
  • Pickle 详解

    那么为什么需要序列化和反序列化这一操作呢 1 便于存储 序列化过程将文本信息转变为二进制数据流 这样就信息就容易存储在硬盘之中 当需要读取文件的时候 从硬盘中读取数据 然后再将其反序列化便可以得到原始的数据 在Python程序运行中得到了一
  • STM32开发(十九)STM32F103 数据手册 —— 低功耗模式解析

    上一篇 主目录 下一篇 文章目录 低功耗介绍 stm32 供电框图 低功耗模式 睡眠模式 停止模式 待机模式 低功耗模式汇总 低功耗介绍 系统复位或上电复位后 微控制器进入运行模式 在运行模式下 CPU通过HCLK提供时钟 并执行程序代码
  • Apollo学习笔记(21)图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    首先奉上大神链接 https www cnblogs com qzhc p 10291430 html 由于最近在看轨迹规划的资料 图遍历是基础 故拜读了大神的一些文章 在此记录 深度优先遍历 深度优先遍历 Depth First Sear