女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

找树屋里的旗子,机器人有两种走法:一条路先走到底,或先看完附近所有房间。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. DFS深入,再回退
  2. BFS近层,再远层
  3. 记录工具栈与队列
  4. 按问题选择是否需要最少步数

DFS 与 BFS 的主要区别是探索顺序。

两者都可以检查可达性;无权图的最短路径常用 BFS。DFS 常用于探索分支结构,是否更省空间要看图的形状。

01它们最大的区别是什么?

DFS

先沿一条路尽量走深。

BFS

先把同一距离的一层处理完。

02分别使用什么结构?

DFS

递归调用栈或显式 stack。

BFS

queue 队列。

03谁能找最短路?

在无权图中:

  • BFS 可以保证最短边数
  • 普通 DFS 找到的第一条路径不保证最短

04谁更省内存?

没有统一答案。

DFS 需要保存当前深度路径及相关状态;BFS 可能需要同时保存一整层甚至很多待处理节点。

05时间复杂度一样吗?

如果使用邻接表,并且每个节点和边只处理常数次,DFS 和 BFS 遍历一般图通常都是:

O(V + E)

V 是顶点数,E 是边数。

06什么时候更适合 DFS?

  • 需要深入尝试和回溯
  • 树的递归结构
  • 连通分量
  • 拓扑、桥、割点等很多图算法基础

07什么时候更适合 BFS?

  • 无权最短路
  • 层序遍历
  • 按距离一层层扩散
  • 多源最短步数

你已经知道了什么

  • DFS 深入优先,BFS 分层优先。
  • DFS 常用栈,BFS 常用队列。
  • 无权最短步数通常使用 BFS。
  • 两者遍历邻接表图通常都是 O(V+E)。
  • 内存谁更省取决于具体图和实现。

下一篇:为什么有的程序一秒就完成,有的要跑很久?

轮到你来试一试

目标就在起点隔壁,但 DFS 先选了一条很长的路,会怎样?

想好了吗?点开看解释

可能很晚才回来检查隔壁;BFS 会先检查所有一步可达的位置。