三大核心算法解析:DFS、BFS与动态规划

深入理解计算机科学中最基础且强大的三种算法思想

深度优先搜索 (DFS)

"一条路走到黑,不行就退回一步换条路"

核心思想

尽可能深地探索当前分支,直到尽头后回溯到最近未探索节点继续深入

工作原理

  1. 从起点开始访问当前节点
  2. 选择未被访问的相邻节点递归应用DFS
  3. 当所有相邻节点都被访问后回溯
  4. 重复直到所有节点被访问

特点

  • 空间复杂度: O(h)或O(V)
  • 时间复杂度: O(V + E)
  • 找到的路径不一定是最短路径

主要应用

图的连通性检测 拓扑排序 环检测 迷宫问题 回溯算法

广度优先搜索 (BFS)

"层层推进,由近及远"

核心思想

逐层探索:先访问所有相邻节点,再访问这些节点的相邻节点

工作原理

  1. 将起点放入队列
  2. 从队列取出节点并访问
  3. 将该节点的所有未被访问相邻节点放入队列
  4. 重复直到队列为空

特点

  • 空间复杂度: O(w)或O(V)
  • 时间复杂度: O(V + E)
  • 总能找到最短路径(边数最少)

主要应用

无权图最短路径 连通性检测 网络爬虫 广播网络 社交网络关系

动态规划 (DP)

"聪明的会计拆解复杂账单"

核心思想

将问题分解为子问题,存储子问题的解,避免重复计算

关键概念

  • 最优子结构: 问题最优解包含子问题最优解
  • 重叠子问题: 相同子问题被反复计算

工作原理

  1. 定义状态(子问题)
  2. 建立状态转移方程
  3. 初始化基础情况
  4. 确定计算顺序
  5. 求解目标状态

主要应用

背包问题 最长公共子序列 编辑距离 最短路径 硬币找零

算法对比分析

特性 DFS (深度优先搜索) BFS (广度优先搜索) DP (动态规划)
核心策略 深度优先,回溯 广度优先,逐层推进 分解子问题,记忆化/制表,避免重复计算
数据结构 栈 (显式或隐式递归栈) 队列 (Queue) 数组/表 (存储状态值)
空间复杂度 O(h) 或 O(V) (树高 或 节点数) O(w) 或 O(V) (树宽 或 节点数) O(子问题数量) (通常是多项式级)
时间复杂度 O(V + E) O(V + E) 依赖于子问题数量和状态转移复杂度
解的性质 找到路径,不一定最短 (边数) 总能找到最短路径 (边数,无权图) 找到最优解 (最小值、最大值、可行性等)
关键应用 连通性、拓扑排序、环检测、回溯、迷宫路径 无权图最短路径、连通性、层级遍历、广播 优化问题:背包、LCS、LIS、编辑距离、最短路径(带权)等
核心要求 图/树结构 图/树结构 最优子结构 + 重叠子问题

形象比喻

DFS: 固执的探险家

像一个勇敢但有点固执的探险家,在迷宫里遇到岔路时,总是选择一条路一直走下去,直到死胡同,然后退回到上一个岔路口选择另一条路。

BFS: 严谨的扫描仪

像一个严谨的扫描仪,它站在起点,先探测所有一步就能到达的地方,然后探测所有两步能到达的地方,确保找到最短路径。

DP: 聪明的会计

像一个聪明的会计在算一笔复杂账。他把大账单拆成很多小账单,并把每个小账单的结果都仔细记录下来,需要时直接查记录而不是重新计算。