算法中DFS & BFS 核心学习笔记

📚 DFS & BFS 核心学习笔记

一句话总结:BFS是"广撒网"逐层推进,DFS是"深挖掘"一条路走到黑


🎯 核心思想对比

BFS - 广度优先搜索

复制代码
🌊 水波纹扩散法:先近后远,逐层推进
  • 口号:"一圈一圈往外荡"
  • 数据结构 :队列 Queue (FIFO)
  • 比喻:往池塘扔石头,波纹一圈圈扩散

DFS - 深度优先搜索

复制代码
🪜 楼梯下潜法:一路向下,不撞南墙不回头
  • 口号:"一条路走到黑"
  • 数据结构 :栈 Stack (LIFO) 或 递归
  • 比喻:走迷宫,选一条路一直走,走不通再回溯

📊 可视化遍历顺序

图结构

复制代码
    A
   /|\
  B C D
  |
  E
搜索类型 访问顺序 特点
BFS A → B → C → D → E 先访问完所有直接邻居
DFS A → B → E → C → D 沿一条路径深入到底

💾 空间复杂度对比

BFS - 横向膨胀

python 复制代码
# 最坏情况:存储整层节点
Queue = [A, B, C, D, E, ...]  # 可能指数级增长
  • 复杂度:O(最大宽度)
  • 树形图:最坏 2^h (h=深度)
  • 优点:适合稀疏图

DFS - 纵向深入

python 复制代码
# 只需存储当前路径
Stack = [A, B, E]  # 最多深度个节点
  • 复杂度:O(最大深度)
  • 树形图:最坏 h (h=深度)
  • 优点:通常更省内存

🎪 经典应用场景

✅ BFS 擅长

场景 原因
最短路径 天然一层=一步,保证最短
橘子腐烂 每分钟感染一层,精准计时
社交网络 "六度人脉"找最短关系链
地图导航 寻找最少换乘/最短距离

✅ DFS 擅长

场景 原因
环检测 深度递归,撞环即返
连通分量 一次遍历标记所有相连节点
拓扑排序 深度优先完成依赖
回溯问题 全排列、子集天然适合递归

💻 代码模板速查

BFS 模板(橘子腐烂风格)

python 复制代码
from collections import deque

def bfs(start):
    queue = deque([start])
    visited = set([start])
    
    while queue:
        node = queue.popleft()  # 关键:先进先出
        for neighbor in node.neighbors:
            if neighbor not in visited:
                visited.add(neighbor)
                queue.append(neighbor)

DFS 模板(课程依赖风格)

python 复制代码
# 递归版(最常用)
def dfs(node, visited, path):
    if node in path:  # 检测环
        return True
    if node in visited:
        return False
    
    visited.add(node)
    path.add(node)
    
    for neighbor in node.neighbors:
        if dfs(neighbor, visited, path):
            return True
    
    path.remove(node)
    return False

# 迭代版(避免递归深度限制)
def dfs_iterative(start):
    stack = [start]
    visited = set()
    
    while stack:
        node = stack.pop()  # 关键:后进先出
        if node not in visited:
            visited.add(node)
            for neighbor in node.neighbors:
                stack.append(neighbor)

🎯 选型决策树

复制代码
问题:需要找"最短路径/最少步数"?
  ├─ 是 → BFS
  └─ 否 → 继续判断

问题:需要检测"是否有环"?
  ├─ 是 → DFS
  └─ 否 → 继续判断

问题:空间是否紧张?
  ├─ 是 → DFS
  └─ 否 → 两者皆可,看实现偏好

🧠 记忆口诀

BFS 口诀

复制代码
队列先进先出,一层一层剥开
波纹扩散自然,最短路径首选

DFS 口诀

复制代码
栈或递归实现,深度优先挖掘
一条路走到黑,环检测神器

⚡ 快速对比表

特性 BFS DFS
顺序 横向逐层 纵向深入
空间 O(宽度) O(深度)
最短路径 ✅ 保证 ❌ 不保证
环检测 ⚠️ 可以但繁琐 ✅ 天然适合
实现 队列迭代 递归/栈
适用 距离、层级 连通、环、回溯

💡 实战技巧

  1. 看到"最短"想BFS:最少步数、最少时间、最少操作
  2. 看到"环"想DFS:检测循环依赖、死锁
  3. 空间爆炸用DFS:图很宽但不深时
  4. 递归太深用BFS:避免栈溢出
  5. 多源起点:BFS可天然多起点同时开始(如橘子腐烂)

最后提醒 :两者时间复杂度都是 O(V+E),选型关键看问题需求空间限制

相关推荐
TechNomad2 小时前
排序算法:希尔排序算法
数据结构·算法·排序算法
im_AMBER2 小时前
Leetcode 83 使数组平衡的最少移除数目中等相关标签 | 尽可能使字符串相等
数据结构·c++·笔记·学习·算法·leetcode
TechNomad2 小时前
排序算法:快速排序算法
算法·排序算法
xu_yule2 小时前
算法基础(图论)—拓扑排序
c++·算法·动态规划·图论·拓扑排序·aov网
mu_guang_2 小时前
算法图解1-算法简介
算法·cpu·计算机体系结构
CoovallyAIHub2 小时前
超越CUDA围墙:国产GPU在架构、工艺与软件栈的“三维替代”挑战
深度学习·算法·计算机视觉
不穿格子的程序员2 小时前
从零开始写算法——二叉树篇2:二叉树的最大深度 + 翻转二叉树
算法·二叉树·深度优先
小O的算法实验室2 小时前
2024年IEEE TAES SCI2区,一种改进人工电场算法用于机器人路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
gugugu.2 小时前
算法:N皇后问题
算法