--- 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 可以 |
点击查看答案与解析 ### ✅ 正确答案:**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** → 纵向钻 → **栈** → 深入