当前位置: 首页 > news >正文

【算法分析与设计】第11篇:图的表示与遍历算法:BFS与DFS的扩展性质

图由顶点和边构成,这个定义简单到可以用一句话说完。但真正开始设计图算法时,第一个要面对的问题非常具体:如何把一张图放进计算机的内存里?不同的存储方式直接决定了后续操作的效率边界,甚至影响了算法的设计思路。


一、两种基本存储方式

设图 G=(V,E)G=(V,E),∣V∣=n∣V∣=n,∣E∣=m∣E∣=m。

邻接矩阵:用一个 n×nn×n 的二维矩阵 AA 存储,若顶点 ii 到顶点 jj 有边则 A[i][j]=1A[i][j]=1(或边的权重),否则为0。空间开销固定为 Θ(n2)Θ(n2)。查询任意两点之间是否存在边的操作是 O(1)O(1),这是邻接矩阵最突出的优势。但对稀疏图(m≪n2m≪n2),大量空间被浪费在存储零值上。此外,若要枚举一个顶点的所有邻居,无论其度数多大,都必须扫描整行,开销为 Θ(n)Θ(n)。

邻接表:为每个顶点维护一个链表(或动态数组),存储与其相邻的顶点。空间开销为 Θ(n+m)Θ(n+m),对于稀疏图极大地节省了内存。枚举某个顶点的所有邻居只需遍历其链表,耗时与该顶点的出度成正比,整体遍历全图所有顶点的邻居总计 Θ(n+m)Θ(n+m)。但查询两点之间是否有边的操作退化到 O(deg⁡(v))O(deg(v)),在最坏情况下可能达到 O(n)O(n)。

选择哪一个取决于图的稠密程度和典型操作。稠密图中邻接矩阵更简洁,大多数实际应用(尤其是算法竞赛和工程实现)中,邻接表因其普适性占主导地位。有些场景会混合使用两者,例如用邻接表存图的结构,另建一个哈希表加速边存在性查询。


二、广度优先搜索:层层推进的最短路径

广度优先搜索(BFS)是图遍历中最直观的策略:从源点 ss 出发,先访问所有距离为1的邻居,再访问距离为2的邻居,依此类推,像水波扩散一样逐层推进。

BFS的标准实现依赖一个队列。将源点入队并标记为已访问,随后不断从队首取出顶点,将其所有未被访问过的邻居入队并标记。每个顶点入队一次、出队一次,每条边被检查一次。若图以邻接表存储,总时间复杂度为 Θ(n+m)Θ(n+m)。

BFS的核心理论性质是它给出的无权最短路径。对于无权图(或所有边权重相同的图),定义 δ(s,v)δ(s,v) 为从 ss 到 vv 的最短路径中包含的边数。BFS恰好按 δ(s,v)δ(s,v) 非递减的顺序访问顶点,且当算法终止时,每个顶点的距离标签 d[v]d[v] 满足 d[v]=δ(s,v)d[v]=δ(s,v)。证明的关键在于BFS队列中至多同时出现两个连续距离层的顶点,这个不变式保证了距离的正确性。

BFS还可以输出从 ss 出发的一棵广度优先树——由访问过程中每个顶点被发现时所经由的边组成的树结构。这棵树中从 ss 到任意顶点 vv 的简单路径,恰好就是最短路径之一。整个最短路径的信息只需额外存储一个前驱数组 π[v]π[v] 即可完整保存。


三、深度优先搜索:时间的精细标定

深度优先搜索(DFS)的策略与BFS截然不同:沿一条路径尽可能深地探索,走到无路可走时再回溯。这个“深入”而非“广撒”的特点,使得DFS能够揭示出图的更丰富的结构信息。

DFS的经典性质集中体现在括号定理上。对每个顶点记录两个时间戳:d[v]d[v] 表示该顶点被发现的时刻(涂灰色),f[v]f[v] 表示该顶点的所有邻接表被探索完毕的时刻(涂黑色)。将每个顶点的活跃区间 [d[v],f[v]][d[v],f[v]] 视为时间轴上的一段括号,括号定理断言:对于任意两个顶点 uu 和 vv,它们的活跃区间要么完全不相交,要么一个完全包含另一个。这意味着后代的活跃区间严格嵌套在祖先的区间之内——这正是“深度优先”的时间结构体现。

括号定理的一个直接推论是边的分类。在DFS过程中,当探索一条边 (u,v)(u,v) 时,根据顶点 vv 的颜色可将边分为四类:

  • 树边:vv 为白色,即 vv 是 uu 在深度优先树中的孩子。

  • 后向边:vv 为灰色,即 vv 是 uu 的祖先,此时边指向树中上方,形成环。

  • 前向边:vv 为黑色且 d[u]<d[v]d[u]<d[v],即 vv 是 uu 的非直接后代。

  • 交叉边:vv 为黑色且 d[u]>d[v]d[u]>d[v],即 vv 与 uu 分属不同的子树分支。

对于无向图,DFS过程中不会出现前向边和交叉边——每一条非树边都是后向边。这是无向图环路检测的基础:如果DFS遇到一条指向非父节点且已访问顶点的边,必定存在环。


四、BFS与DFS的对偶视角

BFS和DFS在无权重图中构建了两类截然不同的生成树——前者是“半径极小”的最短路径树,后者是“深度极大”的生成树。BFS适合处理与距离相关的问题,DFS擅长揭示图的连通结构、环路性质和拓扑顺序。两者均以线性时间运行,是所有更复杂图算法的前置步骤。

本篇所建立的图遍历框架,下一篇将直接扩展为有向无环图的拓扑排序算法,以及有向图中强连通分量的分解——这两个问题恰好构成了图论中“线性结构”与“循环结构”分析的一体两面。

http://www.zskr.cn/news/1396490.html

相关文章:

  • 自动化部署项目软件 Jenkins
  • 收藏!从提示词小白到AI大模型开发者,你需要的不只是工具
  • 终极指南:如何永久保存你的微信聊天记录?免费开源工具WeChatExporter完整教程
  • 2026 年论文双检通关指南:9 款查重 + 降 AIGC 工具横评
  • 北京上门回收明清古籍老书旧书 金石拓片印谱正规渠道首选 - 品牌排行榜单
  • 一文啃完DNS:原理+查询+BIND部署全攻略
  • 2026年AI漫剧视频模型行业白皮书
  • 国内地基地梁模板头部供应商排行 实测维度客观对比 - 奔跑123
  • 鸿蒙 地理编码:正地理编码与逆地理编码
  • 别再只会点灯了!用STM32CubeMx配置GPIO输出模式(推挽/开漏)的实战避坑指南
  • 关于 GEO 的常见误区:你需要避免的五个关键认知偏差
  • 半监督主动学习:结合自监督与多样性采样提升数据利用效率
  • 成都靠谱训犬寄养优选指南|锦江/武侯/成华/青羊/郫都/双流5家店铺推荐 - 资讯速览
  • 深圳小程序公司推荐 助力企业数字化转型优质服务商 - 软件测评师
  • c语言中条件操作符(a>b ? a : b)
  • RabbitMQ 死信交换机与延迟队列:TTL、DLX、DelayExchange怎么理解
  • 生活垃圾处理设备厂家选购指南:如何选到合规高效的解决方案 - 资讯速览
  • 2026年电竞椅牌子推荐:拓际TGIF大牌风范 - 13425704091
  • 2026国产分体式电磁流量计品牌推荐TOP10:技术实力与场景适配深度评测 - 仪表品牌排行榜
  • 如何快速将海尔智能家居接入HomeAssistant:新手完整教程指南
  • 全面指南:Bottles Linux跨平台兼容性终极解决方案
  • Win11 环境部署 Codex、Claude Code + 国产模型
  • 免费好用的论文降ai方法(附10款降ai率工具测评) - 殷念写论文
  • O.o?MCP 的尽头是情趣玩具?先别急,搞懂它到底是什么
  • 2026 性价比高的土工布厂家推荐:恒全土工材料高值低价 - 19120507004
  • 为什么83%的Lovable第三方ISV集成在Q3失败?:独家披露平台OpenAPI v2.4.1兼容性陷阱与向后兼容设计白皮书
  • Java字符串核心知识点详解
  • 学习时序预测-day 01 XGboost进行时序预测
  • Node.js:现代 Web 开发的高性能 JavaScript 运行时
  • java中 (whlie)、 (if else)、( for)、(switch)