广度优先 vs 深度优先搜索
BFS(广度优先搜索)和DFS(深度优先搜索)是两种基本的图遍历算法。BFS使用队列,逐层扩展;DFS使用栈(或递归),尽可能深入探索。
| 特性 | BFS | DFS |
|---|---|---|
| 数据结构 | 队列 (FIFO) | 栈 (LIFO) / 递归 |
| 访问顺序 | 逐层扩展(由近及远) | 尽可能深入,再回溯 |
| 最短路径 | 保证找到(无权图) | 不保证 |
| 空间消耗 | 可能较大(存储整层) | 通常较小 |
| 指标 | BFS | DFS |
|---|---|---|
| 时间复杂度 | O(V + E) | O(V + E) |
| 空间复杂度 | O(V) | O(V) |
V是顶点数,E是边数。两种算法时间复杂度相同,但实际空间使用取决于图的结构。
BFS适用于:
DFS适用于:
from collections import deque def bfs(graph, start): """广度优先搜索""" visited = set() queue = deque([start]) visited.add(start) order = [] while queue: node = queue.popleft() order.append(node) for neighbor in graph[node]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) return order def dfs(graph, start, visited=None): """深度优先搜索(递归)""" if visited is None: visited = set() visited.add(start) order = [start] for neighbor in graph[start]: if neighbor not in visited: order.extend(dfs(graph, neighbor, visited)) return order # 使用示例 graph = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B'], 'F': ['C'] } print("BFS:", bfs(graph, 'A')) # ['A', 'B', 'C', 'D', 'E', 'F'] print("DFS:", dfs(graph, 'A')) # ['A', 'B', 'D', 'E', 'C', 'F']
import java.util.*; public class BfsDfs { /** * 广度优先搜索 */ public static List<String> bfs( Map<String, List<String>> graph, String start) { List<String> order = new ArrayList<>(); Set<String> visited = new HashSet<>(); Queue<String> queue = new LinkedList<>(); queue.offer(start); visited.add(start); while (!queue.isEmpty()) { String node = queue.poll(); order.add(node); for (String neighbor : graph.get(node)) { if (!visited.contains(neighbor)) { visited.add(neighbor); queue.offer(neighbor); } } } return order; } /** * 深度优先搜索 */ public static void dfs( Map<String, List<String>> graph, String node, Set<String> visited, List<String> order) { visited.add(node); order.add(node); for (String neighbor : graph.get(node)) { if (!visited.contains(neighbor)) { dfs(graph, neighbor, visited, order); } } } }