图的表示

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

定义

图(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)格式,空间 但缓存友好;散列邻接表将链表替换为散列表,边查询降至 期望时间。

补充

选型经验法则

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

参见