26考研——图_图的遍历(6)

408答疑


文章目录

  • 三、图的遍历
    • 图的遍历概述
      • 图的遍历算法的重要性
      • 图的遍历与树的遍历的区别
      • 图的遍历过程中的注意事项
        • 避免重复访问
        • 遍历算法的分类
        • 遍历结果的不唯一性
    • 广度优先搜索
      • 广度优先搜索(BFS)概述
      • BFS 的特点
      • 广度优先遍历的过程
        • 示例图
        • 遍历过程
      • BFS 算法的性能分析
        • 基于邻接表存储的 BFS 的效率
      • BFS 算法求解单源最短路径问题
      • 广度优先生成树
    • 深度优先搜索
      • 深度优先搜索(DFS)概述
      • 深度优先遍历的过程
        • 示例图
        • 遍历过程
      • DFS 算法的性能分析
      • 深度优先的生成树和生成森林
    • 注意事项
    • 图的遍历与图的连通性
  • 六、参考资料
    • 鲍鱼科技课件
    • 26王道考研书


三、图的遍历

图的遍历概述

图的遍历是指从图中的某一项点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次,且仅访问一次。
注意到树是一种特殊的图,所以树的遍历实际上也可视为一种特殊的图的遍历。

图的遍历算法的重要性

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

图的遍历与树的遍历的区别

图的遍历比树的遍历要复杂得多,因为图的任意一个顶点都可能和其余的顶点相邻接,所以在访问某个顶点后,可能沿着某条路径搜索又回到该顶点。

图的遍历过程中的注意事项

避免重复访问

为避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点,为此可以设一个辅助数组 visited[] 来标记顶点是否被访问过。

遍历算法的分类

图的遍历算法主要有两种:

  • 广度优先搜索(BFS)
  • 深度优先搜索(DFS)
遍历结果的不唯一性

图的遍历结果顺序是不唯一的,跟选择的起始结点和所求邻接结点的顺序有关。

广度优先搜索

广度优先搜索(BFS)概述

广度优先搜索(Breadth-First-Search, BFS)类似于二叉树的层次遍历算法。基本思想是:首先访问起始顶点 v v v,接着由 v v v 出发,依次访问 v v v 的各个未访问过的邻接顶点 w 1 , w 2 , ⋯ , w r w_1, w_2, \cdots, w_r w1,w2,,wr,然后依次访问 w 1 , w 2 , ⋯ , w r w_1, w_2, \cdots, w_r w1,w2,,wr 的所有未被访问过的邻接顶点;再从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点,直至图中所有顶点都被访问过为止。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为始点,重复上述过程,直至图中所有顶点都被访问到为止。Dijkstra 单源最短路径算法和 Prim 最小生成树算法也应用了类似的思想。

BFS 的特点

广度优先搜索遍历图的过程是以 v v v 为起始点,由近至远依次访问和 v v v 有路径相通且路径长度为 1, 2, … 的顶点。广度优先搜索是一种分层的查找过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有往回退的情况,因此它不是一个递归的算法。为了实现逐层的访问,算法必须借助一个辅助队列,以记忆正在访问的顶点的下一层顶点。

广度优先遍历的过程

示例图

如下图所示,一个无向图 G G G
在这里插入图片描述

遍历过程

假设从顶点 a a a 开始访问, a a a 先入队。此时队列非空,取出队头元素 a a a,因为 b , c b, c b,c a a a 邻接且未被访问过,于是依次访问 b , c b, c b,c,并将 b , c b, c b,c 依次入队。队列非空,取出队头元素 b b b,依次访问与 b b b 邻接且未被访问的顶点 d , e d, e d,e,并将 d , e d, e d,e 入队(注意: a a a b b b 也邻接,但 a a a 已置访问标记,所以不再重复访问)。此时队列非空,取出队头元素 c c c,访问与 c c c 邻接且未被访问的顶点 f , g f, g f,g,并将 f , g f, g f,g 入队。此时,取出队头元素 d d d,但与 d d d 邻接且未被访问的顶点为空,所以不进行任何操作。继续取出队头元素 e e e,将 h h h 入队列……最终取出队头元素 h h h 后,队列为空,从而循环自动跳出。遍历结果为 a b c d e f g h abcdefgh abcdefgh

从上例不难看出,图的广度优先搜索的过程与二叉树的层次遍历是完全一致的,这也说明了图的广度优先搜索遍历算法是二叉树的层次遍历算法的扩展。

BFS 算法的性能分析

无论是邻接表还是邻接矩阵的存储方式,BFS 算法都需要借助一个辅助队列 Q Q Q n n n 个顶点均需入队一次,在最坏的情况下,空间复杂度为 O ( ∣ V ∣ ) O(|V|) O(V)

基于邻接表存储的 BFS 的效率

遍历图的过程实质上是对每个顶点查找其邻接点的过程,耗费的时间取决于所采用的存储结构。采用邻接表存储时,每个顶点均需搜索(或入队)一次,时间复杂度为 O ( ∣ V ∣ ) O(|V|) O(V),在搜索每个顶点的邻接点时,每条边至少访问一次,时间复杂度为 O ( ∣ E ∣ ) O(|E|) O(E),总的时间复杂度为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(V+E)。采用邻接矩阵存储时,查找每个顶点的邻接点所需的时间为 O ( ∣ V ∣ ) O(|V|) O(V),总时间复杂度为 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)

BFS 算法求解单源最短路径问题

若图 G = ( V , E ) G = (V, E) G=(V,E) 为非带权图,定义从顶点 u u u 到顶点 v v v 的最短路径 d ( u , v ) d(u, v) d(u,v) 为从 u u u v v v 的任何路径中最少的边数;若从 u u u v v v 没有通路,则 d ( u , v ) = ∞ d(u, v) = \infty d(u,v)=

使用 BFS,我们可以求解一个满足上述定义的非带权图的单源最短路径问题,这是由广度优先搜索总是按照距离由近到远来遍历图中每个顶点的性质决定的。

广度优先生成树

在广度遍历的过程中,我们可以得到一棵遍历树,称为广度优先生成树,如下图所示。
在这里插入图片描述

需要注意的是,同一个图的邻接矩阵存储表示是唯一的,所以其广度优先生成树也是唯一的,但因为邻接表存储表示不唯一,所以其广度优先生成树也是不唯一的。

深度优先搜索

深度优先搜索(DFS)概述

深度优先搜索(Depth-First-Search, DFS)是一种尽可能“深”地搜索图的算法。其基本思想如下:

  1. 借助临时空间:借助 n n n 个临时空间来标记结点是否被访问过。
  2. 访问顶点:首先访问图中的某一顶点 v v v,接着访问 v v v 的邻接顶点 w w w,访问 w w w 的下一邻接顶点,依次类推,重复上述过程。
  3. 回溯:当不能再继续向下访问顶点时,依次退回到最近被访问的顶点,如果还有其他邻接顶点没有被访问,则继续从该结点出发开始上述的遍历过程,直到图的所有结点被访问完为止。

深度优先遍历相当于二叉树中的前序遍历。

深度优先遍历的过程

示例图

如下图所示,一个无向图 G G G
在这里插入图片描述

遍历过程

深度优先搜索的过程如下:

  1. 首先访问 a a a,并置 a a a 访问标记。
  2. 然后访问与 a a a 邻接且未被访问的顶点 b b b,置 b b b 访问标记。
  3. 然后访问与 b b b 邻接且未被访问的顶点 d d d,置 d d d 访问标记。
  4. 此时 d d d 已没有未被访问过的邻接点,所以返回上一个访问的顶点 b b b,访问与其邻接且未被访问的顶点 e e e,置 e e e 访问标记,以此类推,直至图中所有顶点都被访问一次。遍历结果为 a b d e h c f g abdehcfg abdehcfg

DFS 算法的性能分析

DFS算法是一个递归算法,需要借助一个递归工作栈,所以其空间复杂度为 O ( ∣ V ∣ ) O(|V|) O(V)。遍历图的过程实质上是通过边查找邻接点的过程,因此两种遍历方式的时间复杂度都相同,不同之处仅在于对顶点访问顺序的不同。采用邻接矩阵存储时,总时间复杂度为 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)。采用邻接表存储时,总的时间复杂度为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(V+E)

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

与广度优先搜索一样,深度优先搜索也会产生一棵深度优先生成树。当然,这是有条件的,即对连通图调用DFS才能产生深度优先生成树,否则产生的将是深度优先生成森林,如下图所示。
在这里插入图片描述

与BFS类似,基于邻接表存储的深度优先生成树是不唯一的。

注意事项

图的邻接矩阵表示是唯一的,但对邻接表来说,若边的输入次序不同,则生成的邻接表也不同。因此,对同样一个图,基于邻接矩阵的遍历得到的 DFS 序列和 BFS 序列是唯一的,基于邻接表的遍历得到的 DFS 序列和 BFS 序列是不唯一的。

图的遍历与图的连通性

图的遍历法可以用来判断图的连通性。对于无向图来说,若无向图是连通的,则从任意一个结点出发,仅需一次遍历就能够访问图中的所有顶点;若无向图是非连通的,则从某一个顶点出发,一次遍历只能访问到该顶点所在连通分量的所有顶点,而对于图中其他连通分量的顶点,则无法通过这次遍历访问。对于有向图来说,若从初始顶点到图中的每个顶点都有路径,则能够访问到图中的所有顶点,否则不能访问到所有顶点。

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

六、参考资料

鲍鱼科技课件

b站免费王道课后题讲解: link
在这里插入图片描述

网课全程班: link
在这里插入图片描述

26王道考研书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39619.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025-03-24 学习记录--C/C++-PTA 习题7-6 统计大写辅音字母

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 习题7-6 统计大写辅音字母 英文辅音字母是除A、E、I、O、U以外的字母。本题要求编写程序,统计给…

在vitepress中使用vue组建,然后引入到markdown

在 VitePress 中&#xff0c;每个 Markdown 文件都被编译成 HTML&#xff0c;而且将其作为 Vue 单文件组件处理。这意味着可以在 Markdown 中使用任何 Vue 功能&#xff0c;包括动态模板、使用 Vue 组件或通过添加 <script> 标签为页面的 Vue 组件添加逻辑。 值得注意的…

常见中间件漏洞之一 ----【Tomcat】

中间件Tomcat介绍&#xff1a; tomcat是⼀个开源⽽且免费的jsp服务器&#xff0c;默认端⼝ : 8080&#xff0c;属于轻量级应⽤服务器。它可以实现 JavaWeb程序的装载&#xff0c;是配置JSP&#xff08;Java Server Page&#xff09;和JAVA系统必备的⼀款环境。 在历史上也披露…

Spring Cloud之负载均衡之LoadBalance

目录 负载均衡 问题 步骤 现象 什么是负载均衡&#xff1f; 负载均衡的一些实现 服务端负载均衡 客户端负载均衡 使用Spring Cloud LoadBalance实现负载均衡 负载均衡策略 ​编辑 ​编辑LoadBalancer原理 服务部署 准备环境和数据 服务构建打包 启动服务 上传J…

量化研究--小果聚宽交易系统上线高速服务器,提供源代码

文章链接量化研究--小果聚宽交易系统上线高速服务器&#xff0c;提供源代码https://mp.weixin.qq.com/s/HecSeAvmaCyVCsPhvxA0xg 今天大家反应以前的服务器比较慢&#xff0c;与200多人在使用这个系统&#xff0c;反应比较慢&#xff0c;实时数据请求服务器&#xff0c;服务器还…

蓝桥杯python组备考2(b站课程笔记)超详细

语法进阶 一、列表推导式 想讲解一下示例4到示例7的代码&#xff1a; 4、循环n次生成n个零放进列表中&#xff0c;其实也就是相当于[0]*n&#xff08;列表乘法&#xff0c;将原来的列表循环n次产生一个新的列表&#xff09;&#xff0c;接着在循环n次产生n个这样的列表&#x…

【大模型LLM第十四篇】Agent学习之anthropic-quickstarts Agent

前言 对于anthropic api的快速使用&#xff0c;在github上有几个example Customer Support Agent&#xff1a;由 Claude 提供支持的客户支持代理。该项目演示了如何利用 Claude 的自然语言理解和生成功能来创建可访问知识库的 AI 辅助客户支持系统。Financial Data Analyst &…

用DrissionPage升级网易云音乐爬虫:更稳定高效地获取歌单音乐(附原码)

一、传统爬虫的痛点分析 原代码使用requests re的方案存在以下局限性&#xff1a; 动态内容缺失&#xff1a;无法获取JavaScript渲染后的页面内容 维护成本高&#xff1a;网页结构变化需频繁调整正则表达式 反爬易触发&#xff1a;简单请求头伪造容易被识别 资源消耗大&am…

2025年渗透测试面试题总结- PingCAP安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 PingCAP安全工程师 一、SQL注入判断数据库类型技术分析 1. 常规判断方法 2. 盲注场景下的判断 3. 补…

【加密社】如何创建自己的币圈工具站

需要准备的工作 1.域名 2.服务器 周末的时候主要弄了快讯这方面的代码 我这里用的是星球日报的api&#xff0c;也可以订阅他们的rss&#xff0c;这部分在github上是开源的 https://github.com/ODAILY 我这里用的是WordPressonenav主题&#xff0c;然后用小工具在主页展示&am…

Oracle归档配置及检查

配置归档位置到 USE_DB_RECOVERY_FILE_DEST&#xff0c;并设置存储大小 startup mount; !mkdir /db/archivelog ALTER SYSTEM SET db_recovery_file_dest_size100G SCOPEBOTH; ALTER SYSTEM SET db_recovery_file_dest/db/archivelog SCOPEBOTH; ALTER SYSTEM SET log_archive…

Apache Hive:基于Hadoop的分布式数据仓库

Apache Hive 是一个基于 Apache Hadoop 构建的开源分布式数据仓库系统&#xff0c;支持使用 SQL 执行 PB 级大规模数据分析与查询。 主要功能 Apache Hive 提供的主要功能如下。 HiveServer2 HiveServer2 服务用于支持接收客户端连接和查询请求。 HiveServer2 支持多客户端…

FPGA_DDS_IP核

接下来对FPGA的DDS的ip核进行学习。 首先对DDS需要有些了解 DDS信号发生器采用直接数字频率合成&#xff08;Direct Digital Synthesis&#xff0c;简称DDS&#xff09;技术&#xff0c;简单来说就是 需要一个系统频率和一个输入的数字数据 &#xff0c;用这个系统频率计算出…

欢迎来到未来:探索 Dify 开源大语言模型应用开发平台

欢迎来到未来&#xff1a;探索 Dify 开源大语言模型应用开发平台 如果你对 AI 世界有所耳闻&#xff0c;那么你一定听说过大语言模型&#xff08;LLM&#xff09;。这些智能巨兽能够生成文本、回答问题、甚至编写代码&#xff01;但是&#xff0c;如何将它们变成真正的实用工具…

计算机工具基础(七)——Git

Git 本系列博客为《Missing in CS Class(2020)》课程笔记 Git是一种分布式版本控制系统&#xff0c;被其跟踪的文件可被查询精细到行的修改记录、回退版本、建立分支等 模型 一般流程&#xff1a;工作区 → \to →暂存区 → \to →仓库(本地 → \to →远端) 工作区&#xff1…

uniapp动态循环表单校验失败:初始值校验

问题现象 &#x1f4a5; 在实现动态增减的单价输入表单时&#xff08;基于uv-form组件&#xff09;&#xff0c;遇到以下诡异现象&#xff1a; <uv-input>的v-model绑定初始值为数字类型时&#xff0c;required规则失效 ❌数字类型与字符串类型校验表现不一致 &#x1…

前端框架学习路径与注意事项

学习前端框架是一个系统化的过程&#xff0c;需要结合理论、实践和工具链的综合掌握。以下是学习路径的关键方面和注意事项&#xff1a; 一、学习路径的核心方面 1. 基础概念与核心思想 组件化开发&#xff1a;理解组件的作用&#xff08;复用性、隔离性&#xff09;、组件通信…

【Python机器学习】3.5. 决策树实战:基于Iris数据集

喜欢的话别忘了点赞、收藏加关注哦&#xff08;关注即可查看全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 本文紧承 3.1. 决策树理论(基础) 和 3.2. 决策树理论(进阶)&#xff0c;没看过的建议先看理论分…

Unity2022发布Webgl2微信小游戏部分真机黑屏

复现规律&#xff1a; Unity PlayerSetting中取消勾选ShowSplashScreen 分析&#xff1a; 在Unity中&#xff0c;Splash Screen&#xff08;启动画面&#xff09; 不仅是视觉上的加载动画&#xff0c;还承担了关键的引擎初始化、资源预加载和渲染环境准备等底层逻辑。禁用后导…

docker desktop 集成WSL Ubuntu22.04

Windows docker desktop 设置WSL ubuntu 22.04启用与其他发行版的集成 Windows docker desktop 安装参考 wsl ubuntu 22.04 查看我宿主机的docker desktop 容器全部的信息 wsl -d Ubuntu-22.04 -u root