形式陈述
本页主表固定基础有限简单无向图 公理库 有限简单无向图 Graph · Finite simple undirected graph · 图 由有限顶点集与无序二元顶点子集组成的边集所确定的简单无向图。 G = ( V , E ) ,记 n = | V | 、m = | E | 。邻接矩阵以 n × n 的数组 公理库 数组 Array 以连续整数下标支持随机访问的有限序列结构。 A 表示边,A [ u , v ] 是 Boolean 值且满足 A [ u , v ] = A [ v , u ] 。邻接表为每个顶点 u 存储邻居容器 Adj [ u ] ;每条非自环边 { u , v } 分别在 u 与 v 的表中出现一次,因此所有表项总数为 2 m 。边集表示则直接存储无序端点对 { u , v } 。
下表采用这些操作模型:邻接矩阵直接寻址;邻接表的邻居容器为无序序列,且“加边”一栏假设调用者已知该边不存在,或表示本身允许重复记录。若简单图接口必须先防止重边,需先付出 O ( 1 + deg ( u ) ) 的查边成本。若改成哈希集合 公理库 集合 Set 由成员完全决定的数学对象;成员关系给出集合的内容,额外结构须另行指定。 ,在常数装载率及相应的随机散列假设下,查边可得期望 O ( 1 ) ,但空间和常数因子随之改变。
表示
空间
查询边 u v
遍历 u 的邻居
加边
删边
邻接矩阵
Θ ( n 2 )
O ( 1 )
Θ ( n )
O ( 1 )
O ( 1 )
邻接表(无序序列)
Θ ( n + m )
O ( 1 + deg ( u ) )
Θ ( 1 + deg ( u ) )
摊还 O ( 1 )
O ( 1 + deg ( u ) + deg ( v ) )
边集(含独立顶点表)
Θ ( n + m )
O ( 1 + m )
O ( 1 + m )
摊还 O ( 1 )
O ( 1 + m )
边记录本身只占 Θ ( m ) ;表中另计 Θ ( n ) 的顶点表以保留孤立点和任意顶点标签。若顶点预先隐式固定为 { 1 , … , n } ,可以只保存 n ,但不能仅从边端点推回原顶点集。
变体
有向图 公理库 有向图 Directed graph · Digraph 以顶点有序对为弧、能够保留连接方向的有限简单图结构。 的邻接表通常存出弧,遍历入弧需另建反向表;邻接矩阵不再要求对称。带权图把 Boolean 或邻居编号扩展为含权记录。多重图必须让同一端点对对应多条独立边,或在只关心重数时显式存储 multiplicity。它们改变记录与操作语义,不能直接沿用主表的 2 m 计数和 Boolean 单元解释。
直觉
表示不是算法写完后的存储细节,而是算法能以多大代价看到图。广度优先搜索需要反复枚举当前顶点的邻居:邻接表只触碰实际存在的边,得到 O ( n + m ) ;矩阵每次都扫描整行,哪怕多数位置为零,也会累积到 O ( n 2 ) 。反过来,若算法频繁询问任意一对顶点是否相邻,矩阵的一次寻址可能比线性扫描邻居表更合适。
图片加载失败 同一图的邻接表与邻接矩阵 因此“矩阵更快”或“邻接表更省空间”都缺少条件。图的稀疏程度、是否动态修改、是否要遍历入边、是否允许平行边,以及邻居容器本身是数组、哈希集还是有序树,共同决定真实成本。
例子与边界
对道路网络这类稀疏图,m 通常与 n 同阶。用邻接表运行 BFS 公理库 广度优先搜索 Breadth-first search · BFS 按无权距离分层访问可达顶点的图遍历算法。 时,每个顶点入队至多一次,从每个未发现顶点启动以覆盖全图后,每条无向边的两个表项各检查一次,总工作量为 Θ ( n + m ) ;改用矩阵,即使某个路口只有三条路,也要扫描长度为 n 的整行,最终为 Θ ( n 2 ) 。在顶点很少而边接近完全的图上,两种空间量级趋近,矩阵的直接查边反而可能更简单。
多重图揭示 Boolean 矩阵的边界:两点间两条不同容量的边若都只写成 true,重数和权值都会丢失。可以让矩阵单元存边列表或重数,但此时操作语义与空间分析必须重新说明。自环也要求明确约定:邻接矩阵只占对角线上一个单元,而无向邻接表是存一个表项还是按度数贡献二存两个表项,不同实现皆可,计数公式必须与约定一致。
删除无向边 { u , v } 必须同时从 u 的表中删去 v 、从 v 的表中删去 u 。若两个无序数组没有互指位置索引,就要分别寻找两个记录,因此主表的界是 O ( 1 + deg ( u ) + deg ( v ) ) 。只删除一端会使表示不再对称,让从不同方向开始的搜索得到互相矛盾的连通信息。
例如邻接表为 a : [ b , c ] , b : [ a ] , c : [ a ] ,删除 { a , b } 后应变成 a : [ c ] , b : [ ] , c : [ a ] ,顶点 b 仍须保留。若允许无序排列,找到记录后可用末项覆盖再缩短数组;若要保持邻居顺序,则还须移位。满足前述条件的哈希集合提供期望常数查找时间,有序集合提供对数时间;允许重复边时,还要说明删除一条、全部还是按边标识删除。
推论与应用
DFS 公理库 深度优先搜索 Depth-first search · DFS 沿未访问边尽可能深入后回溯的图遍历算法。 、BFS 与强连通分量算法的 O ( V + E ) 界隐含了能按出边总量遍历的表示。Prim 算法 公理库 Prim 算法 Prim's algorithm 从一个顶点开始反复加入跨越当前割的最轻边的最小生成树算法。 在稠密图上可直接用矩阵做 O ( V 2 ) 实现,在稀疏图上则常把邻接表与优先队列 公理库 优先队列 Priority queue · Priority queue ADT 按键的优先次序反复访问并移除当前最小元素的抽象数据类型。 组合。邻接矩阵还便于使用矩阵乘法、位集合和 GPU 并行操作,邻接表则自然支持逐边松弛。
从文件或网络读入的边集适合交换与批处理,却通常不是查询阶段的最终索引。常见流程是先接收边记录,再依据下游操作建立恰好需要的表示;若同时维护矩阵和邻接表,就必须承担二者同步更新的不变量。
平面细分若还需绕面、跨边和枚举顶点周围的面,可使用双向连接边表 公理库 双向连接边表(DCEL) Doubly-connected edge list · DCEL 用成对半边、面边界环与顶点关联,把平面细分的局部导航和修改组织成可检查的链接不变量。 保存半边、环绕次序与面关联;普通邻接表只记录连边,不能自动恢复这些嵌入信息。
静态稀疏图还可把所有邻接表首尾相接存入一个数组,用长度为 n + 1 的偏移表记录每个顶点的区间。顶点 u 的邻居就是半开区间 [ offset [ u ] , offset [ u + 1 ] ) ;孤立点对应空区间。这种压缩稀疏行表示保留线性遍历成本,却使中间插边可能需要移动后续记录,说明布局更紧凑不等于动态更新更便宜。
参考资料
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms , 4th ed., MIT Press, 2022,§20.1, representations of graphs。
Erik D. Demaine and Srini Devadas, MIT 6.006 Lecture 13: Breadth-First Search , graph representations and adjacency lists, accessed 2026.