1、

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

一次且仅访问一次。

注意:树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历。

》》 图的遍历是图的一种最基本的操作,其他许多操作都是建立在图的遍历操作基础之上。

》》 图的遍历主要有两种算法:广度优先搜索、深度优先搜索

2、广度优先搜索(Breadth-First-Search , BFS)【借助队列实现】

》》 广度优先搜索(BFS)类似于二叉树的层序遍历算法,它的基本思想是首先访问起始顶点 v ,

             接着由 v 出发,依次访问 v 的各个未访问过的邻接顶点 w1 , w2, w3 , ... , wi , 然后再依次访问

             w1 , w2 , w3 , ... , wi 的所有未被访问过的邻接顶点;再从这些访问过的顶点出发,再访问它们所有

             未被访问过的邻接顶点..... 依次类推,直到图中所有顶点都被访问过为止

类似的思想还将应用于  “ Dijkstra 单源最短路径算法 ” 和 “ Prim 最小生成树算法 ”

》》 广度优先搜索是一种分层的查找过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样

有往回退的情况,因此它不是一个递归的算法。为了实现逐层的访问,算法必须借助一个辅助队列

                以记忆正在访问的顶点的下一层顶点

》》 广度优先搜索的案例:【借助队列实现--》非递归算法

假设从 a 开始访问,a 先入队。此时队列非空,取出队头元素 a ,由于 b 、 c 和 a 邻接且未被

访问过,于是依次访问 b 、 c , 并将 b 、c 依次入队。队列非空,取出队头元素 b ,依次访问与

b 邻接且未被访问过的顶点 d 和 e ,并将 d 、 e 入队(注意:a 与 b 也邻接,但是 a 已被设置为

访问标记,故不再重复访问)。此时队列非空,取出队头元素 c ,访问与 c 邻接且未被访问的顶点

f 、 g ,并将 f 、 g 入队。此时,取出队头元素 d ,但与 d 邻接且未被访问过的顶点为空,故而

不进行任何操作。继续取出队头元素 e ,将 h 入队。。。。当最后取出队头元素 h 后,队列为空,

从而循环自动跳出。遍历结果为 abcdefgh

》》 补充1:“ 图的广度优先搜索的过程 ” 与 “ 二叉树的层序遍历 ” 是完全一致的,这也说明了图的

广度优先搜索遍历算法是二叉树的层序遍历算法的扩展。

》》 BFS 算法的性能分析

## 无论是邻接表还是邻接矩阵的存储方式,BFS 算法都需要借助一个辅助队列 Q , n 个顶点均

需要入队一次,在最坏的情况下,空间复杂度为 O( | V | )

##    当采用邻接表存储方式时,每个顶点均需要搜索一次(或入队一次),故时间复杂度为O( | V | ) 。

在搜索任意顶点的邻接点时,每条边至少访问一次,故时间复杂度为 O(| E | ) , 算法的时间复杂度

                     O( | V | + | E | )

## 当采用邻接矩阵存储方式时,查找每个顶点的邻接点 所需要的时间为 O(| V |) ,故算法总的时间

                    复杂度为 O()

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

## 如果图 G = (V , E ) 为非带权图,定义从顶点 u 到顶点 v 的最短路径 d(u,v)  为从 u 到 v 

                   的任何路径中最少的边数;如果从 u 到 v 没有通路,则 d(u,v) = ∞

## 使用 BFS  ,我们可以求解一个满足上述定义的非带权图的单源最短路径问题,这是由广度优先

搜索总是按照距离由近到远来遍历图中每个顶点的性质决定的。

》》广度优先生成树【遍历树】

## 在广度优先搜索的遍历过程中,我们可以得到一棵遍历树,称为“ 广度优先生成树 ”。

注意:一个给定图的邻接矩阵存储表示是唯一的,故其广度优先生成树也是唯一的。

                                 一个给定图的邻接表存储表示不唯一,故其广度优先生成树也是不唯一的

3、深度优先搜索(Depth-First-Search , DFS)【借助递归栈实现】

》》 深度优先搜索(DFS)类似于树的先序遍历。这种搜索算法所遵循的搜索策略是尽可能“深”

地搜索一个图。它的基本思想如下:首先访问图中某一起始顶点 v ,然后由 v 出发,访问与

v 邻接且未被访问的任一顶点 w1 , 再访问与 w1 邻接且未被访问的任一顶点 w2 ,。。。重复

上述过程。当不能再继续向下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被

访问过,则从该点开始继续上述搜索过程,直到图中所有顶点均被访问过为止。

》》 深度优先搜索是借助递归栈实现的。

》》 注意:图的邻接矩阵表示是唯一的,但对于邻接表来说,如果边的输入次序不同,生成的邻接

                      表也不同。

                                对于同样一个图,基于邻接矩阵的遍历所得到的 DFS 序列和 BFS 序列是唯一的,基于

                      邻接表的遍历所得到的 DFS 序列和 BFS 序列是不唯一的

 》》 DFS 算法的性能分析

## DFS 算法是一个递归算法,需要借助一个递归工作栈,故它的空间复杂度为 O( | V | )

## 遍历图的过程实质上是对每个顶点查找其邻接点的过程,其耗费的时间取决于所采用的

存储结构。

a. 当以邻接矩阵表示时,查找每个顶点的邻接点所需要的时间为 O( | V | ) ,故总的时间

                                       复杂度为 O( )

b. 当以邻接表表示时,查找所有顶点的邻接点所需要的时间为 O( | E |  ) ,访问顶点所

需时间为 O(| V | ) ,此时,总的时间复杂度为 O( | V | + | E | ) 

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

深度优先搜索也会产生一棵深度优先生成树。但是,是有条件的。

条件:对连通图调用 DFS 才可以产生深度优先生成树,否则产生的将是深度优先生成森林

4、图的遍历与图的连通性

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

》》 对于无向图来说,如果无向图是连通的,则从任一结点出发,仅需一次遍历就能访问图中

所有顶点;如果无向图是非连通的,则从某一个顶点出发,一次遍历只能访问到该顶点所在

连通分量的所有顶点,而对于图中其他连通分量的顶点,则无法通过这次遍历访问。

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

不能访问到所有顶点。

图的遍历 --- 广度优先搜索【借助队列实现】 + 深度优先搜索【借助递归栈】相关推荐

  1. 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索

    0基础学算法 搜索篇第一讲 深度优先搜索 相信绝大多数人对于深度优先搜索和广度优先搜索是不会特别陌生的,如果我这样说似乎你没听说过,那如果我说dfs和bfs呢?先不说是否学习过它们,至少它们的大名应该 ...

  2. 深度搜索 java_Java中的深度优先搜索

    1. 概述 在本教程中,我们将探讨Java中的深度优先搜索 深度优先搜索(DFS)是一个应用于树.图等数据结构的遍历算法.在移动到下一个分支之前,深度优先搜索会 深度为优先原则去探索新的分支. 在接下 ...

  3. 图的遍历——广度优先搜索(Breadth First Search)

    2019独角兽企业重金招聘Python工程师标准>>> 1.广度优先搜索遍历类似于树的按层次遍历的过程. 假设从图中某顶点V出发,在访问了V之后依次访问V的各个未曾访问过得邻接点,然 ...

  4. 图:邻接矩阵表示法创建无向图并深度优先搜索遍历

    无向图样式: 邻接矩阵法类似于用数组储存,一个一维数组储存顶点信息,还有一个二维数组储存邻接矩阵 用邻接矩阵进行无向图的创建过程: 一,输入总顶点数和边数(几个点,几条边) eg:如图所示即为8点,9 ...

  5. 图的遍历 广度优先遍历(爱思创)

    前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 问题描述: 读入一个用邻接矩阵存储的无向连通图,输出它的广度(宽度)优先遍历序列. 输入格式 第一行一个正整数 n(2≤n≤100) ...

  6. 二叉树的遍历—广度优先(BFS)和深度优先(DFS)python实现

    二叉树 二叉树(Binary tree)是树形结构的一个重要类型.对于二叉树的基础知识这里不做过多介绍,下面我们直接介绍二叉树的遍历方式和如何用python代码去实现二叉树的遍历. 二叉树的遍历(重点 ...

  7. 【vivo2021届秋季校招编程题】【java】广度优先搜索(BFS)/深度优先搜索(DFS)找最短路径长度

    vivo2021届秋季校招编程题 图中 找两点间的最短路径长度 广度搜索bfs/深度搜索dfs vivo游戏中心的运营小伙伴最近接到一款新游戏的上架申请,为了保障用户体验,运营同学将按运营流程和规范对 ...

  8. 八数码深度优先搜索_树的深度优先搜索(上)

    还记得我们说迭代法的具体应用中的二分法吗?我们讨论了一个查字典的例子.如果要使用二分查找,我们首先要把整个字典排个序,然后每次都通过二分的方法来缩小搜索范围.不过在平时的生活中,咱们查字典并不是这么做 ...

  9. 八数码宽度优先搜索python代码_图之遍历--广度优先遍历

    何为广度优先遍历呢? 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去. 基本思想是: 1.从图中某个顶点V0 ...

最新文章

  1. 在 Linux 命令行里与其他用户通信
  2. Window.resizeTo()
  3. linux的/etc/hosts的作用
  4. 黑马程序员Linux系统开发视频之mmap使用注意事项
  5. IDEA中pom.xml中导入spring-boot-starter-thymeleaf报错的解决方案
  6. 相等变为1 编号_JavaScript 中的 4 个相等比较算法的介绍
  7. [LeetCode] Spiral Matrix II
  8. paip.终端服务器超出了最大允许连接数的解决
  9. android wps页面设置,WPS中设置纸张的方法
  10. 将 MySQL 数据库恢复到某个时间点
  11. java类加载器有几种_请问这几种类加载器有什么区别?
  12. JDK各个版本的特性分析|JDK7|JDK8|JDK9|JDK10|JDK11|JDK12|JDK13特性分析
  13. 愚人节就是要搞怪!微信公众号图文应该这样排版!
  14. 【前端探索】移动端H5生成截图海报的探索
  15. java jws web_java 用jws发布一个简单的webservice
  16. TResNet学习笔记 --- TResNet: High Performance GPU-Dedicated Architecture
  17. matlab鱼眼镜头,普通镜头,单目双目相机标定校正(四)
  18. Vagrant up启动失败 invalid byte sequence in UTF-8 (ArgumentError)
  19. 下一个十年,区块链将如何厚“基”薄发?
  20. php怎么把csv转换成excel_php如何把excel转化为csv

热门文章

  1. Python初学笔记1-【循环语句】
  2. 华为交换机console口如何设置密码
  3. 超详细的pytorch版本yolov3安装教程--亲测有效!!!
  4. fx5u模拟量如何读取_三菱FX5U PLC内置模拟量输入为电流怎么设置?
  5. nasm做一个简单的操作系统写字本(3)
  6. 命主属性是水什么意思_八字五行属性查询表,有没有五行属性含水的且
  7. (javascript)(基础知识+实例) 15.JSON,对象克隆,正则表达式
  8. 阿里云DMS添加ECS自建数据库
  9. 【蜂口 | AI人工智能】表情识别——龙鹏 深度学习与人脸图像应用连载(七)...
  10. 20175212童皓桢 实验三敏捷开发与XP实践实验报告