当前位置: 首页 > news >正文

数据结构—图的遍历

6.3图的遍历

遍历定义

​ 从已给的连通图中某一顶点出发,沿着一些边访问遍历图中所有的顶点,且使每个顶点仅被访问一次,就叫作图的遍历,它是图的基本运算。

遍历实质:找每个顶点的邻接点的过程。

图的特点

​ 图中可能存在回路,且图的任一顶点都可能与其他顶点相通,在访问某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。

怎样避免重复访问?

解决思路:设置辅助数组visited[n],用来标记每个被访问过的顶点。

  • 初始状态visited[i]为0
  • 顶点i被访问,改visited[i]为1,防止被多次访问

图常用的遍历

  • 深度优先搜索(Depth First Search——DFS
  • 广度优先搜索(Breadth Frist Search——BFS

6.3.1深度优先遍历(DFS)

方法

  1. 在访问图中某一起始顶点v后,由v出发,访问它的任一邻接顶点w1;
  2. 再用w1出发,访问与w1邻接但还未被访问过的顶点w2;
  3. 然后再从w2出发,进行类似的访问,…
  4. 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u为止。
  5. 接着,退回一步,退到前一次刚访问过的顶点,看是否还有其他没有被访问的邻接顶点。
  6. 如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;
  7. 如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。

例如:

查看源图像

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

6.3.2深度优先搜索遍历算法实现

邻接矩阵无向图深度遍历实现(连通图)

深度优先搜索的应用场景和实际应用效果 - CSDN

void DFS(AMGraph G,int v){//图G为邻接矩阵类型cout<<v;visited[v]=true;//访问第v个顶点for(w=0;w<G.vexnum;w++)//依次检查邻接矩阵v所在的行if((G.arcs[v][w]!=0)&&(!visited[w]))DFS(G,w);//w是v的邻接点,如果w未访问,则递归调用DFS
}
DFS算法效率分析
  • 用邻接矩阵来表示图,遍历图中每一个顶点都要从头扫描该顶点所在行,时间复杂度为O(n2)。
  • 用邻接表来表示图,虽然有2e个表结点,但只需扫描e个结点即可完成遍历,加上访问n个头结点的时间,时间复杂度为O(n+e)。

结论:

  • 稠密图适于在邻接矩阵上进行深度遍历;
  • 稀疏图适于在邻接表上进行深度遍历。

非连通图的遍历

【数据结构——图的遍历】_FEI..的博客-CSDN博客_数据结构图的遍历

6.3.3广度优先搜索(BFS)

方法:从图的某一结点出发,首先依次访问该结点的所有邻接点v1,v2,…,vn再按这些顶点被访问的先后次序依次访问与他们相邻接的所有未被访问的顶点。

​ 重复此过程,直至所有顶点均被访问为止。

数据结构之广度优先遍历算法_Richard678的博客-CSDN博客_广度优先遍历算法

非连通图的广度遍历

【数据结构——图的遍历】_FEI..的博客-CSDN博客_数据结构图的遍历

顶点访问次序:a c d e f h k b g

如何实现图的深度优先和广度优先搜索? - 知乎

void BFS(Graph G,int v){//按广度优先非递归遍历连通图Gcout<<v;visited[v]=true;//访问第v个顶点InitQueue(Q);//辅助队列Q初始化,置空EnQueue(Q,v);//v进队while(!QueueEmpty(Q)){//队列非空DeQueue(Q,u);//队头元素出队并置为ufor(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))if(!visited[w]){//w为u的尚未访问的邻接顶点cout<<w;visited[w]=true;EnQueue(Q,w);//w进队}}
}
BFS算法效率分析
  • 如果使用邻接矩阵,则BFS对于每一个被访问到的顶点,都要循环检测矩阵中的整整一行(n个元素),总的时间代价为O(n2)。
  • 用邻接表来表示图,虽然有2e个表结点,但只需扫描e个结点即可完成遍历,加上访问n个头结点的时间,时间复杂度为O(n+e)。

6.3.4DFS和BFS算法效率比较

  • 空间复杂度相同,都是O(n)(借用了堆栈或队列);
  • 时间复杂度只与存储结构(邻接矩阵或邻接表)有关,而与搜索路径无关。
http://www.lryc.cn/news/117512.html

相关文章:

  • MySQL主从复制基于二进制日志的高可用架构指南
  • RestTemplate HTTPS请求忽略SSL证书
  • Jenkins触发器时间、次数设定
  • kafka partition的数据文件(offffset,MessageSize,data)
  • htnl根据轮播图图片切换背景色
  • gpu-manager安装及测试
  • Go和Java实现享元模式
  • Zookeeper特性与节点数据类型详解
  • 函数的递归
  • Android T 窗口层级其二 —— 层级结构树的构建(更新中)
  • ASIC芯片设计全流程项目实战课重磅上线 ,支持 65nm制程流片 !
  • 背上沉重的书包准备run之react篇
  • LAMP及论坛搭建
  • php-cgi.exe - FastCGI 进程超过了配置的请求超时时限
  • linux系统虚拟主机开启支持SourceGuardian(sg11)加密组件
  • 让我们一起探讨汽车充电桩控制主板的应用
  • Gartner发布《2023年全球RPA魔力象限》:90%RPA厂商,将提供生成式AI自动化
  • springboot整合JMH做优化实战
  • 利用ffmpeg分析视频流
  • 基于kettle实现pg数据定时转存mongodb
  • 使用 POI 在 Word 中重新开始编号、自定义标题格式
  • 【java】default/private/public/protected比较
  • 面试热题(最长上升子序列)
  • Vue 简版文件预览笔记
  • 数据结构--栈和队列
  • 泰国的区块链和NFT市场调研
  • 精彩回顾 | D-Day深圳 上海站:高频策略研发再提速
  • 新法!《个人信息保护合规审计管理办法(征求意见稿)》解读
  • 南大通用数据库-Gbase-8a-学习-37-delete误删数据恢复方法
  • 【高光谱图像的去噪算法】通过全变异最小化对受激拉曼光谱图像进行去噪研究(Matlab代码实现)