广度优先搜索和深度优先搜索的概念

文章目录

概述

广度优先搜索和深度优先搜索在树的遍历中已经简单介绍过,树的遍历基于这两种搜索算法。

广度优先搜索和深度优先搜索的适用场景是广义的无权图,包括实际的图,也包括树和矩阵。无向图和有向图都可以使用广度优先搜索和深度优先搜索。

搜索过程中,需要记录图中每个顶点的访问状态,确保每个顶点最多被访问一次。

广度优先搜索

广度优先搜索的含义是从起始顶点出发,按照层数递增的顺序访问顶点。初始时,当前层只有起始顶点。广度优先搜索的做法如下。

  1. 访问当前层的每个顶点,并获得与当前层的顶点相邻且尚未访问过的全部顶点,即下一层的全部顶点。

  2. 当前层的顶点访问结束之后,访问下一层的每个顶点。

重复上述过程,直到没有更多的顶点需要访问。

由于搜索过程是依次遍历每一层,访问同一层的全部顶点之后访问下一层,故名广度优先搜索。

广度优先搜索基于队列实现。

下图中,从顶点 0 0 0 开始广度优先搜索,未访问的相邻顶点中优先访问编号最小的顶点,访问顶点的顺序是: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 0,1,2,3,4,5,6,7,8,9。

单源广度优先搜索

单源广度优先搜索是最常见的广度优先搜索。只有一个起始顶点,从该起始顶点出发遍历其他顶点。遍历过程中,每个顶点所在层数为该顶点到起始顶点的距离。

多源广度优先搜索

多源广度优先搜索有多个起始顶点,同时从每个起始顶点出发遍历其他顶点。遍历过程中,每个顶点所在层数为该顶点到最近的起始顶点的距离。

双向广度优先搜索

单源广度优先搜索和多源广度优先搜索适用于只给定起始顶点的情形。如果同时给定起始顶点和结束顶点,则可以同时从起始顶点和结束顶点出发,在两个方向上遍历其他顶点,称为双向广度优先搜索。

深度优先搜索

深度优先搜索的含义是从起始顶点出发,对于每条路径深入搜索。初始时,当前顶点是起始顶点。深度优先搜索的做法如下。

  1. 访问当前顶点,并选择与当前顶点相邻且尚未访问过的一个顶点,作为下一个访问的顶点。

  2. 如果当前顶点的相邻顶点都已经访问过,则回退到上一个顶点,直到当前顶点存在相邻且尚未访问过的顶点,将与当前顶点相邻且尚未访问过的一个顶点,作为下一个访问的顶点。

重复上述过程,直到没有更多的顶点需要访问。

由于搜索过程是沿着一条路径深入搜索,直到搜索到路径结束时才回退,故名深度优先搜索。

深度优先搜索基于栈实现,可以通过递归的方式或者显性使用栈的方式实现。

下图中,从顶点 0 0 0 开始深度优先搜索,未访问的相邻顶点中优先访问编号最小的顶点,访问顶点的顺序是: 0 , 1 , 4 , 8 , 9 , 5 , 2 , 3 , 6 , 7 0, 1, 4, 8, 9, 5, 2, 3, 6, 7 0,1,4,8,9,5,2,3,6,7。

广度优先搜索和深度优先搜索的联系和区别

广度优先搜索和深度优先搜索都是遍历图的方法,很多情形下这两种遍历方法都是适用的,例如遍历整个图、判断两个顶点之间是否连通等情况。

广度优先搜索和深度优先搜索的主要区别在于后续待访问顶点的选取,因此访问顶点的顺序不同,使用的数据结构也不同。

广度优先搜索的优点是可以得到每个顶点与起始顶点的最短距离。由于广度优先搜索的做法是按照层数递增的顺序访问顶点,同一层的所有顶点和起始顶点的距离都相同,因此每个顶点所在层数为该顶点到起始顶点的距离。深度优先搜索则不能确保得到每个顶点与起始顶点的最短距离。因此,计算最短距离的问题应使用广度优先搜索。

深度优先搜索的优点是可以使用递归代替栈的数据结构,因此代码实现更简短。

初识并查集

广度优先搜索和深度优先搜索的一个适用情形是判断连通性,连通性问题还可以使用并查集解决。这里对并查集做初步的介绍,高级数据结构部分将会具体介绍并查集。

并查集是一种树型的数据结构,用于处理不相交集合的合并与查询问题。并查集有两种操作:合并与查找。

初始时,每个元素分别属于不同的集合,每个集合只包含一个元素。

每次合并操作时,将两个不相交的集合做合并,变成一个集合。

每次查询操作时,得到元素所在的集合。如果需要判断两个元素是否属于同一个集合,则可以分别对这两个元素执行查询操作得到各自所在的集合,判断这两个元素所在的集合是否相同。

目录

  1. 搜索题目:寻找图中是否存在路径
  2. 搜索题目:岛屿数量
  3. 搜索题目:甲板上的战舰
  4. 搜索题目:岛屿的最大面积
  5. 搜索题目:图像渲染
  6. 搜索题目:省份数量
  7. 搜索题目:岛屿的周长
  8. 搜索题目:01 矩阵
  9. 搜索题目:腐烂的橘子
  10. 搜索题目:地图分析
  11. 搜索题目:钥匙和房间
  12. 搜索题目:飞地的数量
  13. 搜索题目:统计封闭岛屿的数目
  14. 搜索题目:被围绕的区域
  15. 搜索题目:二进制矩阵中的最短路径
  16. 搜索题目:最短的桥
  17. 搜索题目:太平洋大西洋水流问题
  18. 搜索题目:扫雷游戏
  19. 搜索题目:边界着色
  20. 搜索题目:判断二分图
  21. 搜索题目:可能的二分法
  22. 搜索题目:通知所有员工所需的时间
  23. 搜索题目:获取你好友已观看的视频
  24. 搜索题目:最小基因变化
  25. 搜索题目:单词接龙
  26. 搜索题目:打开转盘锁
  27. 搜索题目:水壶问题
  28. 搜索题目:重新规划路线
  29. 搜索题目:连通网络的操作次数
  30. 搜索题目:验证二叉树
  31. 搜索题目:克隆图
  32. 搜索题目:颜色交替的最短路径
  33. 搜索题目:滑动谜题
  34. 搜索题目:为高尔夫比赛砍树
  35. 搜索题目:网格中的最短路径
  36. 搜索题目:扁平化多级双向链表
  37. 搜索题目:公交路线
  38. 搜索题目:穿过迷宫的最少移动次数
  39. 搜索题目:蛇梯棋
  40. 搜索题目:推箱子
  41. 搜索题目:你能从盒子里获得的最大糖果数
  42. 搜索题目:T 秒后青蛙的位置
  43. 搜索题目:隔离病毒
  44. 搜索题目:接雨水 II
  45. 搜索题目:使陆地分离的最少天数
  46. 搜索题目:访问所有结点的最短路径
  47. 搜索题目:获取所有钥匙的最短路径
  48. 搜索题目:逃离大迷宫
  49. 搜索题目:查找集群内的「关键连接」
相关推荐
keep intensify2 小时前
最小覆盖子串
算法
仟濹2 小时前
【算法打卡day35(2026-03-31 周二)】DFS专项训练2(今日算法:DFS & 记忆化搜索 & 回溯)
c++·算法·蓝桥杯·深度优先
炽烈小老头2 小时前
【每天学习一点算法 2026/04/02】最长递增子序列
学习·算法
IronMurphy3 小时前
【算法三十五】22. 括号生成
算法
liuyao_xianhui3 小时前
优选算法_岛屿的最大面积_floodfill算法_C++
java·开发语言·数据结构·c++·算法·leetcode·链表
赵域Phoenix3 小时前
Origin导入xlsx数据解锁编辑
算法
寻寻觅觅☆3 小时前
东华OJ-基础题-33-数字之和(C++)
数据结构·c++·算法
算AI3 小时前
重绘多孔世界的蓝图:GAN助力多孔材料的数字重构
人工智能·深度学习·算法·机器学习·生成对抗网络·ai
ZPC82103 小时前
手柄替代键盘
人工智能·算法·性能优化·机器人