Files
leetcode-go/笔试/微派 Test1/09-单选题7-图遍历.md
T

85 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [笔试, 微派, 图, BFS, DFS, 数据结构]
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 可以 |
<details>
<summary>点击查看答案与解析</summary>
### ✅ 正确答案:**B**
---
### 详细解析
#### BFS vs DFS 核心对比
```mermaid
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(|V|); DFS 需要存储从根到叶子的路径 + 未探索的兄弟节点,空间 O(|E|)。对于稠密图,DFS 可能比 BFS 更耗内存 |
| D | ❌ | **BFS 也能检测环!** BFS 中如果发现遇到一个已访问的节点且不是当前节点的前驱,就说明存在环。虽然 DFS 判环更直观(利用递归栈的 colored 标记法),但说"只有 DFS 可以"是错的 |
#### BFS 为什么能找到最短路径?
```mermaid
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|)(最坏存一整层) | O(|V|)(最坏是深树) |
| 能否检测环 | ✅(遇到已访问的非父节点) | ✅(遇到已访问且在递归栈中的节点) |
| 适用场景 | 最短路径、层次遍历 | 拓扑排序、连通分量、路径查找 |
| 是否能找到解 | ✅ 如果解靠近起点 | ✅ 如果解靠近某条深路径 |
> [!tip] 记忆技巧
> - **BFS = Breadth First Search** → 横向扫 → **队列** → 短路
> - **DFS = Depth First Search** → 纵向钻 → **栈** → 深入
</details>