3.2 KiB
3.2 KiB
tags, create time
| tags | create time | ||||||
|---|---|---|---|---|---|---|---|
|
2026-05-16 15:15 |
09 - 单选题 7:图的遍历(BFS vs DFS)
题目
关于无向图的广度优先搜索 (BFS) 和 深度优先搜索 (DFS),以下说法正确的是:
| 选项 | 内容 |
|---|---|
| A | BFS 使用栈作为辅助数据结构,DFS 使用队列作为辅助数据结构 |
| B | BFS 找到的两点间路径一定是最短路径(每条边的权重相等时) |
| C | DFS 的空间复杂度始终优于 BFS |
| D | BFS 不能用于检测图中的环,只有 DFS 可以 |
点击查看答案与解析
✅ 正确答案:B
详细解析
BFS vs DFS 核心对比
flowchart LR
subgraph "BFS"
Q["📋 队列 Queue"] -->|"FIFO, 先进先出"| L1["按层访问"]
end
subgraph "DFS"
S["📚 栈 Stack / Recursion"] -->|"LIFO, 后进先出"| L2["深入到底再回溯"]
end
逐项分析
| 选项 | 正误 | 原因 |
|---|---|---|
| A | ❌ | 反了! BFS 用队列(Queue),DFS 用栈(Stack)。BFS 一层一层地往外扩展,队列天然适合;DFS 深入挖掘到底后回溯,栈天然适合 |
| B | ✅ 正确 | 在无权图(或等权图)中,BFS 按层遍历,第一次到达目标节点时的路径就是最短路径。这是 BFS 最重要的性质之一 |
| C | ❌ | 不一定。最坏情况下 BFS 需要存储整层节点,空间 O( |
| D | ❌ | BFS 也能检测环! BFS 中如果发现遇到一个已访问的节点且不是当前节点的前驱,就说明存在环。虽然 DFS 判环更直观(利用递归栈的 colored 标记法),但说"只有 DFS 可以"是错的 |
BFS 为什么能找到最短路径?
flowchart TD
subgraph "BFS 层层扩张"
R["起点 S"] --> L1["第1层: A, B"]
L1 --> L2["第2层: C, D, E"]
L2 --> L3["第3层: F"]
end
style R fill:#a8e6cf
style L1 fill:#ffd3b6
style L2 fill:#ffaaa5
style L3 fill:#ff8b94
核心证明思路: BFS 按距离 d = 0, 1, 2, ... 的顺序访问节点。假设存在一条更短的路径长度为 k < d,那么 BFS 会在第 k 层就发现目标节点,矛盾。所以首次到达时的路径必定最短。
BFS vs DFS 完整对比表
| 特性 | BFS | DFS |
|---|---|---|
| 数据结构 | 队列 (Queue) | 栈 (Stack) / 递归 |
| 访问顺序 | 逐层扩展 | 沿路深入到底 |
| 最短路径 | ✅ 无权图中保证 | ❌ 不保证 |
| 空间复杂度 | O( | V |
| 能否检测环 | ✅(遇到已访问的非父节点) | ✅(遇到已访问且在递归栈中的节点) |
| 适用场景 | 最短路径、层次遍历 | 拓扑排序、连通分量、路径查找 |
| 是否能找到解 | ✅ 如果解靠近起点 | ✅ 如果解靠近某条深路径 |
[!tip] 记忆技巧
- BFS = Breadth First Search → 横向扫 → 队列 → 短路
- DFS = Depth First Search → 纵向钻 → 栈 → 深入