写在前面的话:本专栏的主要内容:数据结构与算法。

1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己构建的,未使用系统的库文件,因此,建议这类小伙伴们从本专栏的总揽​​​​​​​​​​​​​​​​​​​​​按顺序进行学习;

​​​​​​​2.对于想查询有关资料的小伙伴们,可以选择性地浏览。希望小伙伴们都能有所收获~

​  ​​​​​​ 】

上一章​​​​​​​我们了解了图的一些基本概念,

本章我们来介绍图的两种最重要的搜索算法:广度优先搜索算法和深度优先搜索算法。

一. 广度优先搜索算法

广度优先搜索(也叫宽度优先搜索,缩写BFS)是连通图的一种遍历算法,这一算法也是很多重要的图的算法的原型。下几章将要介绍的Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和广度优先搜索类似的思想。这是一种盲目搜索法,它并不考虑结果的可能位置,而是彻底地搜索整张图,直到找到结果为止。一般用队列结构来辅助实现BFS算法。

广度优先搜索的核心思想:对于某个节点,BFS总是先遍历该节点的所有邻接节点。

下面我们用一系列图示来理解BFS的遍历过程:

上图中,我们从节点A出发,进行BFS搜索,首先,遍历A节点(标灰):

然后,遍历A节点的所有邻接节点----B和D:

对于已遍历的B和D,遍历B的所有邻接节点C(注意,对于B的已访问的邻接节点A,D,不会再次进行访问),遍历D的所有邻接节点E(对于D的已访问的邻接节点A,B,不会再次进行访问)(此外先遍历B或D均可):

继续同上,遍历C,E的所有邻接节点 ,由于C的所有邻接节点均已访问,故节点C的遍历结束。E还有未被访问的邻接节点F,故遍历F:

此时节点F的所有邻接节点均已被访问,故节点F的遍历结束。

之后,全图搜索是否还有未被访问的节点,如何有,选取任意一个未被访问的节点,重复上述遍历,直至所有的节点均被访问,BFS结束。

此时,该图的一种BFS搜索的结果序列为:A-->B-->D-->C-->E-->F。

从上述的过程可以看出,BFS搜索的结果序列是不唯一的,读者可以想一想下面的序列是不是BFS搜索得到的?

1. A-->D-->B-->C-->E-->F

2. A-->B-->D-->C-->E-->F

3. A-->B-->D-->E-->F-->C

(答案在文末)

二. 深度优先搜索算法     

深度优先搜索(DFS​​​​​​​,Depth First Search)是针对图的一种遍历算法。利用深度优先搜索算法可以产生对应图的拓扑排序表,利用其拓扑排序表可以方便地解决很多相关的图问题。一般用栈结构来辅助实现DFS算法。

深度优先搜索的核心思想:对某一条路径,DFS会一直深入到不能深入为止,接着回溯至上一节点继续搜索。

同样的,我们已一系列图示来理解DFS的搜索过程:

用上面同样的图:

随机取一个节点,比如节点A,访问它,将其标灰:​​​​​​​

然后,从节点A开始,沿某一条路径一直深入(顺次访问路上的每个节点)直至不能深入为止,如A-->B-->D-->E-->F,注意遍历至F后不会再遍历B,同一节点只能访问一次:

此时,DFS已搜索至节点F,由于节点F已经没有未被访问的分支来继续深入,这时,DFS搜索会“回溯”到节点F的上一个节点-----E,如果节点E还有未被访问的分支,继续访问并深入直至不能深入为止;如果节点E的分支均已被访问,则继续“回溯”到节点E的上一个分支,重复以上操作。这样,一直“回溯到节点B的时候,发现节点B有一个未被访问的分支:B-->C,因此访问并深入这条路径:

重复上述过程(深入+回溯),当“回溯”到起始路径(A-->B-->D-->E-->F)的起始节点A时,节点A没有未被访问的分支,从而这条路径搜索完毕。

接着,全局搜索是否还有未被访问的节点,如果有,任意取一个未被访问的节点,继续上述过程,直至“回溯”到该节点......;如果没有,则全图搜索完毕。

我们得到了DFS的搜索结果序列:A-->B-->D-->E-->F-->C。

同BFS一样,DFS搜索的结果序列是不唯一的。请读者思考下面的序列是不是DFS的搜索结果?

4. A-->B-->D-->C-->E-->F

5. A-->D-->B-->C-->F-->E

6. A-->D-->E-->F-->B-->C

最后,请读者细细体会BFS和DFS的原理,尤其是DFS中关于“回溯”的过程,这是算法领域里一种非常重要的​​​​​​​思想。这两种搜索方式不仅适用于图,也适用于树等具有关联特性的结构。掌握这两种搜索方式,是学习图中其他内容的基础。

最后,附上文前答案:(BFS搜索结果:1,2;DFS搜索结果:3,5,6)

下一章,我们将介绍图中另外一个重要的概念-----拓扑排序,点击跳转:

数据结构与算法之-----图(拓扑排序)​​​​​​​

数据结构与算法之-----图(搜索算法)相关推荐

  1. 数据结构与算法之-----图(拓扑排序)

    [​​​​​​​ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据 ...

  2. python函数结构图_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  3. python define graph_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  4. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  5. 特征图注意力_从数据结构到算法:图网络方法初探

    作者 | 朱梓豪 来源 | 机器之心 原文 | 从数据结构到算法:图网络方法初探 如果说 2019 年机器学习领域什么方向最火,那么必然有图神经网络的一席之地.其实早在很多年前,图神经网络就以图嵌入. ...

  6. 数据结构与算法之图的应用

    数据结构与算法之图的应用 图的定义和基本概念 图的实现 数组〈邻接矩阵〉 邻接表 图的应用 最小生成树 Prim(普里姆)算法 Kruskal(克鲁斯卡尔)算法 最短路径 迪克斯特拉算法 拓扑排序 执 ...

  7. 数据结构与算法--符号图

    数据结构与算法--符号图 为了计算简单,传统的图中,都是使用整数来表示顶点,这样难免会有点抽象,不能直接反映各个顶点代表的信息.在实际生活中,使用图时一般会建立一个一一对应的关系表,如下 顶点 0 1 ...

  8. js数据结构和算法(8)-图

    8-图(第11章) 8.1 图的定义 图是一种非线性结构,由一系列顶点及其连接顶点的边组成.比如A和B.A和D是相邻的,而A和E不是相邻的.一个顶点相邻顶点的数量叫作度,比如A的度为3.D的度为4.路 ...

  9. 数据结构与算法之-----图(代码实现)

    [ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己构建的,未使用 ...

最新文章

  1. 下列哪个可以选中矩形文字块_PPT很难?一个字母就可以搞定
  2. qt 中常见错误汇总
  3. Jquery实现点击页面发送弹幕效果
  4. UGUI 自动布局的重叠BUG
  5. Tensorflow中的Protocol Buffer
  6. mp4无法用于直播流
  7. EDI许可申请 简介
  8. 利用WPF创建含多种交互特性的无边框窗体
  9. 斯坦福大学的 CS231n课程
  10. java/poi 调整Excel 列宽支持自适应中文字符宽度
  11. JAVA设计模式-11-代理模式(动态)(一)
  12. crt设置自动保存日志的方法
  13. flashwindow vb_VB6.0 加载ShockwaveFlash(flash)控件
  14. IBM ServerGuide 9.21
  15. 第4课【STM32的时钟】时钟 时钟源 内外部时钟 高低速时钟
  16. 网神保障中国中化集团公司核心业务安全
  17. 三维坐标点绕任意轴旋转的新坐标计算
  18. Ios html 离线浏览,离线iOS应用的HTML 5制作指南(2)
  19. java字符串如何转为数组_java如何将字符串转为数组
  20. Ubuntu 安装和配置Eclipse

热门文章

  1. CCNA认证(2)--网络互联基础
  2. GPS时间服务器在电力监控系统中的应用方案
  3. RabbitMQ入门:发布/订阅(Publish/Subscribe)
  4. 第四届蓝桥杯c/c++B组8
  5. shell判断文件,目录是否存在或者具有权限 (转载)
  6. 我的Maven POM配置
  7. 16.Java中的String详解
  8. 一个实用的JS自定义函数addLoadEvent()
  9. 配置 Logback 异步 Appender 时注意顺序
  10. 使用bat脚本添加JAVA_HOME和修改PATH