返回

图的存储

闲谈


图在计算机中的存储方式主要有邻接表和邻接矩阵两种,前者基于树形结构,后者则基于二维矩阵。图的存储方式应满足:

  • 快速查找与指定顶点相关联的边
  • 快速查找与指定边相关联的顶点
  • 快速添加或删除边和顶点

邻接表

邻接表法利用数组来存储图的顶点,并将每个顶点和与之相关联的边的信息存储在一个单链表中。

存储结构

  • 顶点表:存储图中所有顶点的集合。
  • 边表:存储图中所有边的集合。
  • 邻接表:对于每个顶点,创建一个链表来存储与该顶点相关联的边。

存储示例

图:

     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|是图中顶点的数量,因为需要更新邻接矩阵中的所有元素值。

选择存储方式

邻接表和邻接矩阵这两种存储方式各有优缺点。邻接表更适合于稀疏图,即边数远少于顶点数的图,因为邻接表只需要存储与每个顶点相关联的边,而邻接矩阵则需要存储所有顶点之间的边,无论这些边是否存在。邻接矩阵更适合于稠密图,即边数与顶点数接近或超过顶点数的图,因为邻接矩阵只需要存储一个矩阵,而邻接表则需要存储多个链表。

在实际应用中,图的存储方式的选择通常取决于图的具体结构和应用场景。