图的表示

图的两种标准计算机表示方法:邻接表(空间 ,适合稀疏图)和邻接矩阵(空间 ,适合稠密图),本质是在存储效率与操作效率之间做权衡。

定义

图(Graph)

一个图 由顶点集 和边集 组成。每条边是一个顶点对 ,其中 。在有向图中边是有序对,在无向图中边是无序对。

邻接表(Adjacency List)

图 的邻接表表示由一个包含 条链表的数组 组成。对于每个顶点 , 包含所有满足 的顶点 。空间复杂度为 。

邻接矩阵(Adjacency Matrix)

图 的邻接矩阵表示使用一个 的矩阵 ,其中 当 ,否则为 。带权图中 存储边权值。空间复杂度为 。

核心性质

性质邻接表邻接矩阵
空间复杂度
判断边 是否存在
枚举 的所有邻居
枚举所有边
添加边
删除边
适合场景稀疏图($E
自环/多重边自然支持需特殊处理

关系网络

graph LR
    A["图的表示"] --> B["邻接表"]
    A --> C["邻接矩阵"]
    B --> D["广度优先搜索"]
    B --> E["深度优先搜索"]
    C --> F["Floyd-Warshall算法"]
    B --> G["Dijkstra算法<br/>(稀疏图)"]

章节扩展

第20章:基本图算法

图的表示是所有图算法的基础。CLRS 默认假设输入图使用邻接表表示。邻接表的核心优势在于空间紧凑——对于稀疏图(如社交网络,),邻接表的 空间远优于邻接矩阵的 。邻接矩阵的优势在于 的边查询,适合需要频繁判断边存在性的算法(如 Floyd-Warshall)。

无向图的特殊性质: 在无向图的邻接表中,每条边 同时出现在 和 中,总长度为 。无向图的邻接矩阵是对称矩阵,可利用对称性将空间减半。

工程扩展: 大规模图计算中常用 CSR(Compressed Sparse Row)格式,空间 但缓存友好;散列邻接表将链表替换为散列表,边查询降至 期望时间。

补充

选型经验法则

当 (平均度数小于 )时,邻接表几乎总是更好的选择。对于稠密图(),邻接矩阵的 空间与邻接表同级,且连续内存布局带来更好的缓存性能。

参见