数据结构——6.3 图的遍历

6.3 图的遍历

一、概念

  1. 图的广度优先遍历

    1. 在这里插入图片描述

    2. 树的广度优先遍历(层序遍历):不存在“回路”,搜索相邻的结点时,不可能搜到已经访问过的结点:

      1. 若树非空,则根节点入队

      2. 若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队

      3. 重复②直到队列为空

    3. 图的广度优先遍历(Breadth-First-Search,BFS):搜索相邻的顶点时,有可能搜到已经访问过的顶点

      1. 找到与一个顶点相邻的所有顶点

      2. 标记哪些顶点被访问过

      3. 需要一个辅助队列

    4. 上述图的广度优先遍历的缺陷:只能遍历连通图,非连通图无法遍历

    5. 改进的BFS算法:

      1. 遍历visited数组,如果该顶点未被访问,则调用BFS

      2. BFS执行完成,回到①,直到所有顶点都被访问过

      3. 结论:对于无向图,调用BFS函数的次数=连通分量数

      4. 空间复杂度:最坏情况,辅助队列大小为 o(V)

    6. 广度优先遍历时间复杂度来源:找点、找边

    7. 邻接矩阵存储的图:

      1. 访问 V个顶点需要O(V)的时间

      2. 查找每个顶点的邻接点都需要O(V)的时间,而总共有V个顶点

      3. 时间复杂度=O(V²)

    8. 邻接表存储的图:

      1. 访问V个顶点需要O(V)的时间

      2. 查找各个顶点的邻接点共需要O(E)的时间

      3. 时间复杂度= O(V+E)

    9. 广度优先生成树

      1. 广度优先生成树由广度优先遍历过程确定。由于邻接表的表示方式不唯一,因此基于邻接表的广度优先生成树也不唯一。
    10. 广度优先生成森林

      1. 对非连通图的广度优先遍历,可得到广度优先生成森林
    11. 在这里插入图片描述

  2. 图的深度优先遍历DFS

    1. 在这里插入图片描述

    2. 树的深度优先遍历——其一:树的先根遍历:不存在重复访问问题

    3. 图的深度优先遍历:存在重复访问问题——设置标记数组:栈

    4. 在这里插入图片描述

    5. 上述DFS存在的问题:无法遍历非连通图

    6. 改进:与BFS改进相似

    7. 复杂度分析

      1. 空间复杂度:来自函数调用栈,最坏情况,递归深度为O(V)

      2. 时间复杂度=访问各结点所需时间+探索各条边所需时间

    8. 邻接矩阵存:时间复杂度:O(V²)

    9. 邻接表存:时间复杂度O(V+E)

    10. 在这里插入图片描述

    11. 深度优先遍历序列唯一性与生成树个数

      1. 同一个图的邻接矩阵表示方式唯一,因此深度优先遍历序列唯一,深度优先生成树也唯一

      2. 同一个图邻接表表示方式不唯一,因此深度优先遍历序列不唯一,深度优先生成树也不唯一

  3. 图的遍历与图的连通性

    1. 对无向图进行BFS/DFS遍历

      1. 调用BFS/DFS函数的次数=连通分量数

      2. 对于连通图,只需调用1次 BFS/DFS

    2. 对有向图进行BFS/DFS遍历

      1. 调用BFS/DFS函数的次数要具体问题具体分析

      2. 若起始顶点到其他各顶点都有路径,则只需调用1次BFS/DFS 函数

      3. 对于强连通图,从任一结点出发都只需调用1次 BFS/DFS

    3. 在这里插入图片描述

二、理解

  1. 当各边的权值相等时,广度优先算法可以解决单源最短路径问题

  2. 图的广度优先遍历相当于树的层次遍历

  3. 广度优先遍历需要用到队列

  4. 深度优先遍历需要用到栈

  5. 图的深度优先遍历相当于树的先根遍历,广度优先相当于树的层次遍历

  6. 深度优先遍历可以判断图中是否存在环

  7. 使用DFS递归遍历无环有向图,在退出时递归输出相应的顶点,得到逆拓扑有序顶点序列

三、技巧

  1. n个顶点,e条边的图采用邻接表存储,

    1. BFS遍历时

      1. 时间复杂度:O(n+e):顶点表每个点和边表每个边都要遍历一次

      2. 空间复杂度:O(n):每个点都入一次队

    2. DFS遍历时

      1. 时间复杂度:O(n+e):顶点表每个点和边表每个边都要遍历一次

      2. 空间复杂度:O(n):每个点都入一次队

  2. 画图的深度优先生成树、广度优先生成树:

    1. 先根据题目信息把图画出来

    2. 根据深度优先路径或广度优先路径,把不在路径上的边删去,即为生成树

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

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

相关文章

docker常用容器命令

首先说下容器: 它是指当docker运行镜像时,创建了一个隔离环境,称之为 容器。 这种方式优点:可以开启多个服务,服务之前是互相隔离的(比如:在一台服务器上可以开启多个mysql,可以是…

C#,泰波拿契数(Tribonacci Number)的算法与源代码

1 泰波拿契数(Tribonacci Number) 泰波拿契数(Tribonacci Number)是斐波那契的拓展。 泰波拿契数 (Tribonacci Number) 即把费波拿契数 (Fibonacci Number) 的概念推广至三个数。 2 计算结果 3 源程序 using System; namespace…

作业2.12

1、选择题 1.1、以下程序的输出结果是____A____。 main() { int k11,k22,k33,x15; if(!k1) x--; else if(k2) if(k3) x4; else x3; printf(“x%d\n”,x); } A x4 B x15 C x14 D x3 1.2、有以下程序,while循环执行____A____次。 int main&#x…

vulnhub-->hacksudo-Thor靶机详细思路

目录 1. IP探测2.端口服务扫描3.网站漏洞扫描4.目录扫描5.信息分析6.破壳漏洞(Shellshock)nmap---漏洞检测CVE-2014-6271 7.nc反弹8.提权9.service提权 1. IP探测 ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:10:3c:9b, IPv4: 19…

Unity性能优化

非原创 ,参考文章: 2024 腾讯游戏客户端面经 - 知乎 (zhihu.com) C#篇 1.Unity API GameObject.GetComponent Unity是基于组件的开发方式,所以GetComponent是一个高频使用的函数 每次调用GetComponent 时,Unity都要去遍历所有的组件来找到目标组件…

Qt【一】:Qt3个窗口类的区别、VS与QT项目转换

一、Qt3个窗口类的区别 QMainWindow:包含菜单栏、工具栏、状态栏 QWidget:普通的一个窗口,什么也不包括 QDialog:对话框,常用来做登录窗口、弹出窗口(例如设置页面) QDialog实现简易登录界面…

【原创 附源码】Flutter安卓及iOS海外登录--Tiktok登录最详细流程

最近接触了几个海外登录的平台,踩了很多坑,也总结了很多东西,决定记录下来给路过的兄弟坐个参考,也留着以后留着回顾。更新时间为2024年2月7日,后续集成方式可能会有变动,所以目前的集成流程仅供参考&#…

【Linux】构建模块

🔥博客主页:PannLZ 🎋系列专栏:《Linux系统之路》 🥊不要让自己再留有遗憾,加油吧! 文章目录 构建第一个模块1模块的makefile2内核树内构建3内核树外构建 构建第一个模块 可以在两个地方构建模…

Python:函数和lambda表达式

函数实质性特定任务的一段代码,程序通过将一段代码定义成函数,并为该函数指定一个函数名,这样即可在需要的时候多次调用这段代码。因此,函数是代码复用的重要手段。 与函数紧密相关的一个知识点就是lambda表达式。lambda表达式可…

防御保护防火墙综合实验

一:办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 以上两条链路,任意一条故障则可以通过另一条链路继续上网 二:分公司设备可以通过总公司的移动链路和 电信…

C||1.水仙花数是指一个n位数,每一位数字的n次幂的和正好等于这个数本身。2.有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。

1.水仙花数是指一个n位数&#xff0c;每一位数字的n次幂的和正好等于这个数本身。 比如&#xff1a;153 13 53 33。 要求打印出所有三位数的水仙花数。 #include <stdio.h> #include <math.h> int main() {int i,x,y,z;for(i100;i<1000;i){xi/100%10;yi/10%…

多旋翼无人机飞行控制详解,四旋翼无人机飞控原理深入解析

在四旋翼无人机中&#xff0c;相邻的两个螺旋桨旋转方向是相反的。如图所示&#xff0c;三角形红箭头表示飞机的机头朝向&#xff0c;螺旋桨M1、M3的旋转方向为逆时针&#xff0c;螺旋桨M2、M4的旋转方向为顺时针。当飞行时&#xff0c;M2、M4所产生的逆时针反作用力&#xff0…