当前位置: 首页 > 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.jsqmd.com/news/892913/

相关文章:

  • 终极指南:如何永久保存你的微信聊天记录?免费开源工具WeChatExporter完整教程
  • 收藏!从提示词小白到AI大模型开发者,你需要的不只是工具
  • 【无标题】AI 智能体时代的超级个体:OPC 与 OPD 人才生态分析
  • 2026 论文双降工具横评:从 paperxie 到 9 大神器,查重降 AIGC 全场景通关
  • 自动化部署项目软件 Jenkins
  • 长沙靠谱训犬寄养优选指南|岳麓/雨花/开福/天心/星沙/望城5家店铺推荐 - 资讯速览
  • 02、双指针删除元素
  • 一文啃完DNS:原理+查询+BIND部署全攻略
  • 2026年AI漫剧视频模型行业白皮书
  • 云原生技术学习日志Day01:Linux基础入门
  • 北京上门回收明清古籍老书旧书 金石拓片印谱正规渠道首选 - 品牌排行榜单
  • WarcraftHelper 终极指南:3分钟解决魔兽争霸3卡顿、宽屏、FPS限制等常见问题
  • Sora 2正式版发布首周深度逆向:Transformer时序建模新范式、世界模型耦合机制与3个尚未修复的生成漏洞(内测工程师内部备忘录)
  • Agent开发面经
  • 保姆级教程:用RDPWrap解锁Win10/11家庭版远程桌面,还能多人同时登录
  • 国内地基地梁模板头部供应商排行 实测维度客观对比 - 奔跑123
  • 基于SCCA-RMP的属性网络异常检测:融合结构与属性视图的鲁棒方法
  • Pulover‘s Macro Creator 终极指南:从零到精通的自动化脚本生成器
  • 关于 GEO 的常见误区:你需要避免的五个关键认知偏差
  • 2026年6月帝舵售后服务中心官方公告:官方服务热线公布,更新门店地址清单 - 资讯速览
  • 从卡文到爆文只需17分钟,专业作家私藏的ChatGPT创意生成工作流,限免开放48小时
  • 成都靠谱训犬寄养优选指南|锦江/武侯/成华/青羊/郫都/双流5家店铺推荐 - 资讯速览
  • 信息检索结合制品关系:提升需求追踪精度的IR_CRT方法详解
  • 深圳小程序公司推荐 助力企业数字化转型优质服务商 - 软件测评师
  • 2026最新廊坊水处理药剂品牌排行:5家头部品牌实力对比 廊坊水处理药剂品牌推荐 - 奔跑123
  • Wireshark深度流量分析实战:从协议解析到根因定位
  • 国内水泥围墙模具头部企业排行:品质与服务实测对比 - 奔跑123
  • 鸿蒙英语备考页面构建:考试选择与每日进度模块详解
  • C语言入门——C语言常见概念
  • 生活垃圾处理设备厂家选购指南:如何选到合规高效的解决方案 - 资讯速览