85 lines
3.2 KiB
Markdown
85 lines
3.2 KiB
Markdown
|
|
---
|
|||
|
|
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>
|