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

图的两种基本遍历策略:BFS按层扩展探索最近顶点,DFS沿深度优先探索最远顶点

共同点

  • 时间复杂度均为 O(V+E)
  • 都需要访问标记(颜色数组)避免重复访问
  • 都构建前驱子图(π数组)形成生成树/森林
  • 都是许多高级图算法的基础构件

关键区别

维度广度优先搜索深度优先搜索
数据结构FIFO 队列栈(递归调用栈或显式栈)
探索策略层序扩展(先近后远)深度优先(先远后回溯)
发现顺序按距源点的距离递增按DFS树的先序遍历
最短路径保证无权图最短路径不保证最短路径
空间复杂度O(V)(队列)O(V)(递归栈最坏情况)
边分类树边/非树边(不细分)树边/回边/前向边/横叉边
时间戳d[u]/f[u] 发现/完成时间
适用场景最短路径、层次遍历拓扑排序、SCC、环检测
不变量BFS层次性质括号定理、白色路径定理

深层联系

  1. 对偶性:BFS使用队列(FIFO),DFS使用栈(LIFO),两者是数据结构对偶在图遍历中的体现
  2. 统一框架:两者都可以看作通用图搜索(Generic Search)的特例,区别仅在于边缘集合(fringe)的存储结构
  3. 互补应用:Kosaraju算法同时使用两种遍历——第一次DFS计算完成时间,第二次BFS(在转置图上)发现SCC

参见