深度优先搜索广度优先搜索

1. 什么是 “搜索” 算法

我们知道,算法都是作用于某种具体的数据结构上的,而深度优先搜索算法和广度优先搜索算法就是作用于图这种数据结构的。

图上的搜索算法,就是从图中的一个顶点出发,到另一个顶点的路径。图有两种存储方法,邻接矩阵和邻接表,在这里我们用邻接表来存储图,并以无向图作为例子,但这两种算法也同样都可以应用在有向图中。

V 为顶点个数,E 为边的条数。

深度优先搜索

深度优先搜索(Depth-First-Search),简称 DFS,最直观的例子就是走迷宫。

假设你站在迷宫的某个分岔路口,你想找到出口。你随意选择一个岔路口来走,走着走着发现走不通的时候就原路返回到上一个分岔路口,再选择另一条路继续走,直到找到出口,这种走法就是深度优先搜索的策略。

上图中,我们希望找到一条从 s 到 t 的路径,其中实线表示向前遍历,虚线表示回退。可以看到,深度优先搜索到的并不是从 s 到 t 的最短路径。

实际上,深度优先搜索用的是一种比较著名的思想——回溯思想,这种思想非常适合用递归来实现。深度优先搜索的代码里面有几个和广度优先搜索一样的部分 visited、prev 和 Print() 函数,它们的作用也都是一样的。此外,还有一个特殊的 found 变量,标记是否找到终止顶点,找到之后我们就可以停止递归不用再继续查找了。

在深度优先搜索算法中,每条边最多会被访问两次,一次是遍历,一次是回退。所以,深度优先搜索的时间复杂度为 O(E)。

visited、prev 数组的大小为顶点个数,而递归函数调用栈的最大深度不会超过顶点的个数,所以深度优先搜索的空间复杂度为 O(V)。

广度优先搜索

广度优先搜索(Breadth-First-Search),一般简称为 BFS。直观地讲,它其实就是一种地毯式层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索。

下面我们来看一下广度优先搜索的时间复杂度和空间复杂度。

最坏情况下,终止顶点 t 距离起始顶点 s 很远,需要遍历完整个图才能找到。这时候,每个顶点都要进出一遍队列,每条边也都会被访问一次。所以,广度优先搜索的时间复杂度为 O(V+E),V 为顶点个数,E 为边的条数。针对一个所有顶点都是联通的图,E 肯定要大于 V-1,所以时间复杂度可以简写为 O(V)。

空间复杂度主要是三个变量所占用的额外空间,和顶点个数成正相关,为 O(V)。

其中,有三个非常重要的辅助变量需要特别注意。

  • visited,布尔数组,记录顶点是否已经被访问过,访问过则为真,没有访问过则为假,这里用 0 和 1 表示。
  • vertex,记录上一层的顶点,也即已经被访问但其相连的顶点还没有被访问的顶点。当一层的顶点搜索完成后,我们还需要通过这一层的顶点来遍历与其相连的下一层顶点,这里我们用队列来记录上一层的顶点。
  • prev,记录搜索路径,保存的是当前顶点是从哪个顶点遍历过来的,比如 prev[4] = 1,说明顶点 4 是通过顶点 1 而被访问到的。

参考文献

https://zhuanlan.zhihu.com/p/95081559

https://blog.csdn.net/curry___/article/details/81742727

深度优先搜索 广度优先搜索理解相关推荐

  1. 深度优先搜索广度优先搜索

    1 概述 算法是作用于具体的数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于图这种数据结构的.主要原因是因为图的这种数据结构表达能力很强,大部分涉及搜索的场景都可以抽象成图. 图上的搜索算法 ...

  2. 6.1 图的深度优先和广度优先搜索

    图的广度优先搜索 图的的搜索算法主要分为广度优先搜索(breadth-first search或BFS)和深度优先搜索(depth-first search或DFS).首先讨论广度优先搜索算法. 称之 ...

  3. 图的遍历——深度优先搜索+广度优先搜索

    一:图的遍历--深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容,更加详细的代码实现及算法分析在此给出. 深度优先搜索(DFS)类似树的先序遍历. 假设初始状态是图中所有顶点未曾被访问,则深 ...

  4. Python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...

  5. 邻接矩阵的深度优先和广度优先搜索

    c语言中图的邻接矩阵的深度优先和广度优先搜索 #include<stdio.h> #include<stdlib.h> typedef struct {int vexs[7]; ...

  6. 深度优先和广度优先搜索

    目录 前言 1 深度优先搜索 2 广度优先搜索 3 深度优先和广度优先的比较 前言 最近面试,被问到了深度优先和广度优先搜索,这个我似曾相识,曾经大学的时候学到过,但是由于这几年的工作都未接触到,所以 ...

  7. networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...

    在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...

  8. 数据结构 图 简单入门 最小生成树 深度优先搜索 广度优先搜索

    早上上班路上,看到一则新闻,广州的.新闻说的是一个辅警在路边查过往路人的身份证,其中有一个记者,就询问,根据哪条法律要查询他的身份证.辅警当然不知道(事后据说,就是闲着无聊,查着玩的!),也肯定不会认 ...

  9. 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...

    度:某个顶点的度就是依附于该顶点的边的个数 子图:一幅图中所有边(包含依附边的顶点)的子集 路径:是由边顺序连接的一系列定点组成 环:至少含有一条边且终点和起点相同的路径 连通图:如果图中任一个到另一 ...

最新文章

  1. php中的网页漂浮代码,JavaScript_Javascript实现带关闭按钮的网页漂浮广告代码,复制代码 代码如下: html - phpStudy...
  2. JVM-Java程序性能监控-初级篇
  3. STL--vector、pair
  4. 【花式】基于matlab花圣诞树【含Matlab源码 001期】
  5. 计算机联锁怎么排进路,计算机联锁进路选排设计
  6. 四川大学计算机学院2020推免公示,2020四川大学计算机学院推免夏令营通知
  7. cpu顶盖怎么看步进_【有趣】第19期:如何从CPU顶盖获取有用信息(上)?
  8. 生信学习——转录组测序分析的大致流程
  9. word标题排序包括有汉字和罗马数字的标题排序
  10. 2018年1月份最热门的JavaScript开源项目
  11. 【错题】#10兰州烧饼——思考角度的转换
  12. ElasticSearch整合SpringBoot的API操作
  13. 快速调用编辑器来写一条长,复杂或难的命令--用Enki学Linux系列(5)
  14. AIGC在营销图片生成技术综述
  15. jsf取js变量_JSF页面中的JS取得受管bean的数据(受管bean发送数据到页面)
  16. 土地利用规划之平时作业一
  17. Paypal+本地支付,是跨境外贸收款最好的解决方案!
  18. java毕业设计家居体验平台的设计与实现Mybatis+系统+数据库+调试部署
  19. 一种时空无监督的事故检测方法
  20. 2022-2028年全球与中国运动钓鱼用具行业市场需求预测分析

热门文章

  1. SpringBoot+Vue 驾校理论课模拟考试系统
  2. 全球及中国高频干式嵌体行业竞争态势及未来发展规划报告2022-2028年
  3. 11月23日全球域名商解析量TOP22:爱名网升至十九名
  4. POJ 2983-Is the Information Reliable?(差分约束系统)
  5. 详解Mybatis一对多、多对一、多对多
  6. twine_如何在WordPress中嵌入Twine故事
  7. FullGC频繁,线程数持续增长排查
  8. Cannot find module ‘***‘ ... Vetur(2307)
  9. C语言学习笔记(字符串和字符串函数)
  10. 重磅 | 银行数字化转型调研报告