数据结构--图的遍历(广度优先遍历、深度优先遍历)

2023-11-19

目录

图的遍历

广度优先遍历(BFS)

广度优先遍历的代码实现​编辑

广度优先遍历序列​编辑

遍历序列的可变性​编辑

 BFS算法完整版​编辑

广度优先遍历复杂度分析

 广度优先生成树

 广度优先生成森林

 回顾广度优先遍历

深度优先遍历(DFS)

回顾树的先根遍历​编辑

图的深度优先遍历代码​编辑

 深度优先遍历(DFS)算法完整版

图的深度遍历复杂度问题

空间复杂度

时间复杂度 

深度优先遍历序列

深度优先的生成树和生成森林

图的遍历和连通性

回顾深度优先遍历


 

图的遍历

图的遍历是指从图中的某一顶点出发,按照某种搜索方法,沿着图中的边对图中的所有顶点访问一次,且仅访问一次。

注意到树是一种特殊的图,所以树的遍历实际上也可视为一种特殊的图的遍历。

图的遍历算法是求解图的连通性问题,拓扑排序和求关键路径等算法的基础。

图的遍历比树的遍历要复杂的多,因为图的任何一个顶点都可能和其余的顶点相连接。所以在访问某个顶点后,可能沿着某条路径搜索又回到该顶点上。为避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点。为此可以设一个辅助数组  visited[]  来标记顶点是否被访问过。图的遍历算法主要有两种,广度优先搜索深度优先搜索

广度优先遍历(BFS)

图的广度优先遍历类比树的层次遍历

     广度优先搜索(BFS)类似于二叉树的层次遍历算法,基本思想是,首先访问起始顶点v,接着由v出发,依次访问v的各个未访问过的邻接顶点W1、W2......Wi。然后依次访问W1、W2、....Wi的所有未访问过的邻接顶点,再从这些访问过的顶点出发,访问他们所有未被访问过的邻接顶点,直至图中的所有顶点都被访问过为止。若此时图中尚有顶点未被访问。则另选图中一个未曾被访问过的顶点作为始点,重复上述过程直至图中的所有顶点都被访问到为止。

     换句话说,广度优先搜索遍历途中的过程是以v为起始点,由近至远依次访问和v有路径相通,且路径长度为1、2.....的顶点。

     广度优先搜索是一种分层的查找过程,每向前走一步,可能访问一批顶点,不像深度优先搜索那样有往回退的情况,因此广度优先搜索不是一个递归的算法。为了实现逐层的访问算法,必须借助一个辅助队列,以记忆正在访问的顶点的下一层顶点。

 

广度优先遍历的代码实现

 

辅助数组   visited[]  标志顶点是否被访问过,其初始状态为false。在图的遍历过程中,一旦某个顶点Vi被访问,就立即置visited[i]为true,防止它被多次访问。

广度优先遍历序列

 

遍历序列的可变性

 

BFS算法完整版

 

广度优先遍历复杂度分析

 

 广度优先生成树

 在广度遍历的过程中,我们可以得到一颗遍历树,称为广度优先生成树。需要注意的是,同一个图的邻接矩阵存储表示是唯一的。故其广度优先生成树也是唯一的。但是由于邻接表存储表示不唯一,故其广度优先生成树也是不唯一的。

 广度优先生成森林

 

 回顾广度优先遍历

 

 

深度优先遍历(DFS)

图的深度优先遍历类似于树的先根遍历

与广度优先搜索不同,深度优先搜索(DFS)类似于树的先序遍历,如其名称中所暗含的意思一样。这种搜索算法所遵循的搜索策略是尽可能“深”地搜索一个图,它的基本思想如下,首先访问图中的某一起始顶点v,然后由v出发,访问与v邻接并且未被访问的任意一个顶点W1。在访问与W1邻接且未被访问的任意一个顶点W2.....重复上述过程,当不能再继续往下访问时,依次退回最近被访问的顶点,如果他还有邻接顶点未被访问过。则从该顶点开始继续上述搜索过程,直至图中的所有顶点均被访问过为止。

 

回顾树的先根遍历

图的深度优先遍历代码

 

 深度优先遍历(DFS)算法完整版

 

图的深度遍历复杂度问题

空间复杂度

 

时间复杂度 

 

深度优先遍历序列

 

 

深度优先的生成树和生成森林

与广度优先搜索一样,深度优先搜索也会产生一颗深度优先生成树,当然这是有条件的,即对连通图调用深度优先遍历(DFS)才能产生深度优先生成树,否则产生的将是深度优先生成森林。与广度优先遍历(BFS)类似,基于邻接表存储的深度优先生成树是不唯一的。

图的遍历和连通性

图的遍历算法可以用来判断图的连通性。

对于无向图来说,若无向图是连通的,则从任意一个节点出发,仅需一次遍历,就能够访问图中的所有顶点;若无向图是非连通的。则从某一个顶点出发,一次遍历只能访问到该顶点所在连通分量的所有顶点,而对于图中其他连通分量的顶点,则无法通过这次遍历访问。

对于有向图来说,若从初始点到图中的每个顶点都有路径,则能够访问到图中的所有顶点,否则不能访问到所有的顶点。

故在BFSTraverse()或DFSTraverse()中添加了第二个for循环,在选取初始点,继续进行遍历,以防止一次无法遍历图的所有顶点。对于无向图,上述两个函数调用BFS(G,i)或DFS(G,i)的次数等于该图的连通分量数;而对于有向图则不是这样,因为一个连通的有向图,分为强连通的和非强连通的,它的连通子图也分为强连通分量和非强连通分量,非强连通分量一次调用BFS(G,i)或DFS(G,i)无法访问到该连通分量的所有顶点。

 

 

回顾深度优先遍历

 

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

数据结构--图的遍历(广度优先遍历、深度优先遍历) 的相关文章

随机推荐

  • 「2020年大学生电子设计竞赛分享」电源题,省一等奖!

    点击上方 大鱼机器人 选择 置顶 星标公众号 福利干货 第一时间送达 01 到底参不参赛 嗡嗡嗡 随着手机的一声振动 锁屏弹出了消息提醒 没看全文 依稀瞄到2020 TI杯 几个字眼我便知道自己将面临一个艰难的抉择 庚子年春 突如其来的新型
  • 芜湖,前端这波起飞!

    前天加完班 回家路上翻了下粉丝群 发现群里最近在疯传一份叫 前端offer收割机养成指南 的资料 本来感觉这个title看起来有点离谱 结果没想到仔细一看 这份资料竟然真的有点东西 内容收纳的很全 而且融合了很多今年的新玩意 据我所知有人靠
  • BSD、Apache、MIT、GPL、LGPL几种常见的开源协议

    转载地址 https www cnblogs com Vito2008 p 4806677 html 1 BSD开源协议 original BSD license FreeBSD license Original BSD license B
  • u盘安装ubuntu问题:卡在引导界面不动

    问题 一直卡在如图界面不动 分析 既然一直提示syslinux 那我们就看看他是什么东西吧 原因 syslinux分区引导记录问题 解决方案1 安装bootice软件 将制作好的启动盘插入电脑 用bootice更改syslinux引导记录
  • 8.10:如何在Python中判断文件类型?

    在计算机科学领域中 文件类型判断是一个非常基础和重要的问题 不同类型的文件需要采取不同的处理方式 因此在处理文件时 我们需要准确地判断文件类型 Python作为一门流行的编程语言 提供了许多方法来判断文件类型 在本文中 我们将介绍几种常见的
  • @vitejsplugin-vue requires vue (>=3.2.13) or @vuecompiler-sfc to be present in the dependency tree

    运行项目的时候 首先会提示要安装 vue compiler sfc 但是安装后运行项目成功但是页面是空白并且报错 VUE HMR RUNTIME is not defined 摸索了半天 查看到package json依赖文件 没有vue
  • RTX线程通信之——线程标志

    文章目录 Thread Flags 概念 RTX线程标志API 案例 LED灯同步闪亮 小结 参考资料 Thread Flags In a real application we need to be able to communicate
  • mbedtls 入门第四课--移植mbedtls到VS和ESP8266--8266SDK SHA256移植

    承接上篇 我们初步了解了mbedtls的文件路径以及文件作用以后就是想着如何将mbedtls移植到各种平台 博主这里只有两种移植方法 第一是将代码移植到VS中 第二个是将代码移植到博主跑动的比较多的小众SOC ESP8266 移植到ESP8
  • 【华为OD机试】五子棋迷(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 题目描述 张兵和王武是五子棋迷 工作之余经常切磋棋艺 这不 这会儿又下起来了 走了一会儿 轮张兵了 对
  • 技术积累 — Keil 查看内存占用/优化代码

    原文链接 转自Sugar的专栏 转载文章 若有不妥 通知后我会立即删除 一 查看内存占用 1 使用Keil编辑代码时 编译成功后 双击红色框框位置 就会弹出 map文件 2 那么map文件中能够读出哪些信息呢 Program Size Co
  • caffe中lstm的实现以及lstmlayer的理解

    本文地址 http blog csdn net mounty fsc article details 53114698 本文内容 本文描述了Caffe中实现LSTM网络的思路以及LSTM网络层的接口使用方法 本文描述了论文 Long ter
  • 自学软件测试需要多久?怎么自学软件测试?自学软件测试可以找到工作吗? 绝对干货!

    一 前言 最近经常有很多朋友问我想要入行软件测试 但是都不知道该怎么学 这里详细的给大家说下 对于0基础的朋友 应该怎么去学习软件测试 学习软件测试有2条路可以选 1 找个靠谱的培训机构去培训啦 你就什么都不用想了 跟着培训结构认真的学习就
  • Hive Sql执行出错 Dag submit failed due to java.io.IOException: All datanodes DatanodeInfoWithStorage

    原因 根本原因是集群中的一个或多个信息块在所有节点中都已损坏 因此映射无法获取数据 命令 hdfs fsck list corruptfileblocks 可用于识别集群中损坏的块 当数据节点中打开的文件数量较少时 也会出现此问题 解决方案
  • 微信小程序传递数组给服务器,微信小程序页面间的数组如何传递

    A页面 数组 对象都需要stringify var listData JSON stringify that data listData var taskArray JSON stringify that data taskArray wx
  • visual studio2019(C#/.NET)安装教程

    前言 好久没有跟新版本了 博主还用的2017 看到最新的2019功能还是很强大的 版本可能越高越好 所以博主写了一个详细的博客 希望可以帮助到大家 一 visual studio 2019 下载 1 下载地址 visual studio官方
  • 爬取药品监督情况数据

    首先打开国家药品监督局的相应网址 国家药品监督局的相应网址 找到某一家企业点击相应的许可证编号那一个栏目 查看相应的许可证情况 上面对应的内容为我们需要爬取的对应的数据 不确定对上述的网页进行访问的时候 我们能够得到对应的企业名称 许可证编
  • apollo5.5感知模块改进

    apollo5 5感知模块改进 最近一直在研究百度的apollo源码感知部分 下面整理一下近期的一些知识点 apollo5 5在感知部分做了些升级 以适应最新的apollo自动驾驶套件 主要的特征及改进 1 全新的数据Pipline服务以及
  • 射发射整改案例

    文章摘录 http www elecfans com emc emi 1244893 html 试验现象 系统在300K 200MHz辐射发射超标 2 诊断过程 1 使用近场探头置于模块显示屏时 1MHz以下频段超标 则低频电磁干扰来源于显
  • pandas 行、列的增删改查

    读取tips xlsx及预览内容 行的增删改查 增加行 直接赋值 可以只写一个值 也可以写列表 df loc 40 1 df loc 40 1 2 3 4 5 6 7 append方法 append 增加行的方法 设置ignore inde
  • 数据结构--图的遍历(广度优先遍历、深度优先遍历)

    目录 图的遍历 广度优先遍历 BFS 广度优先遍历的代码实现 编辑 广度优先遍历序列 编辑 遍历序列的可变性 编辑 BFS算法完整版 编辑 广度优先遍历复杂度分析 广度优先生成树 广度优先生成森林 回顾广度优先遍历 深度优先遍历 DFS 回