返回
图的存储
闲谈
2023-12-20 11:00:08
图在计算机中的存储方式主要有邻接表和邻接矩阵两种,前者基于树形结构,后者则基于二维矩阵。图的存储方式应满足:
- 快速查找与指定顶点相关联的边
- 快速查找与指定边相关联的顶点
- 快速添加或删除边和顶点
邻接表
邻接表法利用数组来存储图的顶点,并将每个顶点和与之相关联的边的信息存储在一个单链表中。
存储结构
- 顶点表:存储图中所有顶点的集合。
- 边表:存储图中所有边的集合。
- 邻接表:对于每个顶点,创建一个链表来存储与该顶点相关联的边。
存储示例
图:
A --- B
/ | |
/ | D |
/ | |
C ---- E --- F
邻接表:
A: [B, C]
B: [A, D]
C: [A, E]
D: [B, E]
E: [C, D, F]
F: [E]
时间复杂度
- 查找与指定顶点相关联的边:O(|E|),其中|E|是与该顶点相关联的边的数量。
- 查找与指定边相关联的顶点:O(1),因为边表中存储了边的源顶点和目标顶点。
- 添加或删除边:O(|V|),其中|V|是图中顶点的数量,因为需要更新与该边相关联的顶点的邻接表。
- 添加或删除顶点:O(|E|),其中|E|是与该顶点相关联的边的数量,因为需要更新与该顶点相关联的边的邻接表。
邻接矩阵
邻接矩阵法利用二维矩阵来存储图的顶点和边。矩阵的元素值表示两个顶点之间是否有一条边。
存储结构
- 邻接矩阵:一个二维矩阵,矩阵的元素值表示两个顶点之间是否有一条边。
存储示例
图:
A --- B
/ | |
/ | D |
/ | |
C ---- E --- F
邻接矩阵:
A B C D E F
A 0 1 1 0 0 0
B 1 0 0 1 0 0
C 1 0 0 0 1 0
D 0 1 0 0 1 0
E 0 0 1 1 0 1
F 0 0 0 0 1 0
时间复杂度
- 查找与指定顶点相关联的边:O(|V|),其中|V|是图中顶点的数量。
- 查找与指定边相关联的顶点:O(1),因为边表中存储了边的源顶点和目标顶点。
- 添加或删除边:O(1),因为只需要更新邻接矩阵中的一个元素值。
- 添加或删除顶点:O(|V|^2),其中|V|是图中顶点的数量,因为需要更新邻接矩阵中的所有元素值。
选择存储方式
邻接表和邻接矩阵这两种存储方式各有优缺点。邻接表更适合于稀疏图,即边数远少于顶点数的图,因为邻接表只需要存储与每个顶点相关联的边,而邻接矩阵则需要存储所有顶点之间的边,无论这些边是否存在。邻接矩阵更适合于稠密图,即边数与顶点数接近或超过顶点数的图,因为邻接矩阵只需要存储一个矩阵,而邻接表则需要存储多个链表。
在实际应用中,图的存储方式的选择通常取决于图的具体结构和应用场景。