1. 深度优先搜索(DFS)算法解析
深度优先搜索(Depth-First Search)是图论中最基础的遍历算法之一。我第一次接触DFS是在解决迷宫问题时,当时就被它"一条路走到黑"的特性所吸引。与广度优先搜索不同,DFS会优先沿着一条路径深入探索,直到无法继续前进才回溯,这种特性使其在解决某些特定问题时非常高效。
1.1 DFS核心思想与工作原理
DFS的核心思想可以类比为走迷宫时的策略:选择一条路径一直走到底,遇到死胡同就返回到最近的分叉点尝试其他路径。这种"深度优先"的特性使其天然适合用递归实现,因为递归的调用栈完美匹配了回溯的需求。
算法执行过程:
- 从起始顶点开始,标记为已访问
- 访问该顶点的第一个未访问邻接顶点
- 对新顶点重复上述过程
- 当没有未访问的邻接顶点时,回溯到上一顶点
- 重复上述过程直到所有可达顶点都被访问
注意:DFS的遍历顺序不唯一,取决于邻接顶点的访问顺序。这也是DFS与BFS的一个重要区别。
1.2 DFS的时空复杂度分析
时间复杂度:O(V+E)
- 每个顶点被访问一次(V)
- 每条边被检查一次(E)
空间复杂度:O(V)
- 递归调用栈的最大深度为顶点数
- 访问标记数组需要O(V)空间
在实际应用中,DFS的空间效率通常优于BFS,因为不需要存储所有已访问顶点的信息,只需要维护当前路径上的顶点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. DFS的代码实现与优化
2.1 递归实现(基础版)
java复制// 邻接表表示的图
List<List<Integer>> adj;
boolean[] visited;
List<Integer> traversalOrder = new ArrayList<>();
void dfs(int v) {
visited[v] = true;
traversalOrder.add(v);
for (int neighbor : adj.get(v)) {
if (!visited[neighbor]) {
dfs(neighbor);
}
}
}
递归实现简洁明了,但需要注意:
- 递归深度过大可能导致栈溢出
- 每次递归调用都
