【数据结构和算法】图的遍历(深度优先遍历DFS与广度优先遍历BFS)

简介: 【数据结构和算法】图的遍历(深度优先遍历DFS与广度优先遍历BFS)

图的遍历


遍历定义:

image.png

(遍历的实质:找到每个顶点的邻接点的过程)


图的遍历特点

image.png


解决重复遍历方法

image.png


图的遍历

image.png


1、深度优先遍历(DFS)

方法:

image.png

例子:

image.png

(连通图的深度优先遍历类似于树的先跟遍历,走不动再往回退)

image.png

思想思路  

(其中辅助数组visited[n],一开始初始化为0,访问到就初始化为1。)

大致算法实现

void DFS(AMraph G, int v){  //图G为邻接矩阵类型
  cout << v;    //访问第v个顶点
  visited[v] = true;  //做标志
  for( w = 0; w < G.vexnum; w++)  //依次检查邻接矩阵v所在的行
  {
    if(G.arcs[v][w] != 0 && ! visited[w]) //如果w是v的邻接点,且w未被访问,则递归调用DFS
    DFS(G,w);
  }
}


简单分析代码实现过程:

0.以上图为例,首先以2为起点出发,在邻接表中找到2指向1和5,按顺序,首先先到1.

  1. 对1做标志,然后继续寻找下一个,在邻接表中找到2为第一个,但是2已经做了标志,所以继续找,找到3.
  2. 然后在3中找,首先是1,但是1已经做了标志,找其他的,找到了5.然后在5中开始寻找,但是5中全部都已经做了标志,什么也找不到,循环结束。
  3. 递归回到上一级3,3接着剩下的循环找6,但是6没有连接,所以循环也结束,继续递归上一级1.
  4. 1之前是循环找到了2,2完成了,所以到3,3也完成了,然后循环到4,4此时还没有做标志,所以进入4。
  5. 4中在邻接表中找到1,1已经作了标志不行,然后找到了6,6可以,递归到6。
  6. 但是在6的循环中,全部都不符合,所以循环结束,返回到4的循环。
  7. 4的循环找的是6,6为最后一个,所以4的循环也结束了,递归返回1的循环。
  8. 1上次循环到4,接着循环寻找,但是56都不符合条件,递归返回到起点2.
  9. 而起点2开始循环到1,所以接着循环。但是其他的已经没有符合条件的,所以2的循环也结束,此时遍历完。


DFS算法效率分析(以无向图为例)

image.png

结论:

稠密图适用于邻接矩阵上进行深度遍历

稀疏图适用于在邻接表上进行深度遍历


2、广度优先遍历(BFS)

方法

image.png

例子(以连通图为例)

image.png

思想思路

image.png

(利用了一个队列对图进行广度优先算法的思路)


大致算法实现

按广度优先的非递归遍历连通图G

void BFS(Graph G,int v){  //按广度优先算法遍历(非递归)
  count << v;    //访问第v个顶点
  visited[v] = true;  
  InitQueue(Q);   //辅助队列Q初始化,置空
  EnQueue(Q,v);   //v进队
  while( !QueueEmpty(Q)){ //队列非空,就不断的将队列中的元素找到其其他的连接弧
  DeQueue(Q,u);  //队头元素出队并置为u
  //从第一个弧开始,不断的找下一条弧,再看下一条弧设计到的结点有无被访问
  for ( w = FirstAdjVex(G,u); w >= 0; w = NextAdjVex(G,u,w))
  {
    if( !visited[w] ){  //w为u的尚未访问的邻接顶点
    cout << w;    //表示出于w处
    visited[w] = true;  //如果没有做标志表示为走,做标志
    EnQueue(Q,w);  //w进队
    }
  }
  }
}


BFS算法效率分析

image.png

DFS与BFS算法效率比较

  • 空间复杂度相同,都是O(n).(借用了堆栈或队列)
  • 时间复杂度只与存储结构(邻接矩阵n2或邻接表n+e)有关,而与搜索路径无关。
目录
相关文章
|
27天前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
88 4
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
92 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
41 20
|
25天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
1月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
98 23
|
24天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
56 1
|
1月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
1月前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
58 5
|
1月前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
38 2
|
1月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
45 0