返回

图的存储结构:巧妙搭建图论世界

闲谈

图是一种抽象的数据结构,它用来表示对象之间的关系。图的存储结构是图论的重要组成部分,它决定了图的算法如何实现。

邻接表

邻接表是一种常用的图存储结构。邻接表用一个数组来存储图中的顶点,然后为每个顶点创建一个链表来存储与该顶点相邻的顶点。

1. 邻接表存储有向图

对于有向图,邻接表的每个顶点对应的链表中的元素是一个二元组,第一个元素是与该顶点相邻的顶点, вторая是两个顶点之间的权值。

頂點 A:
(B, 1)
(C, 2)

頂點 B:
(C, 3)

頂點 C:
(D, 4)

2. 邻接表存储无向图

对于无向图,邻接表的每个顶点对应的链表中的元素是一个顶点,而不包含权值。

頂點 A:
B
C

頂點 B:
A
C

頂點 C:
A
D

邻接集

邻接集是一种与邻接表类似的图存储结构。邻接集也是用一个数组来存储图中的顶点,然后为每个顶点创建一个集合来存储与该顶点相邻的顶点。

1. 邻接集存储有向图

对于有向图,邻接集的每个顶点对应的集合中的元素是一个二元组,第一个元素是与该顶点相邻的顶点, вторая是两个顶点之间的权值。

頂點 A:
{(B, 1), (C, 2)}

頂點 B:
{(C, 3)}

頂點 C:
{(D, 4)}

2. 邻接集存储无向图

对于无向图,邻接集的每个顶点对应的集合中的元素是一个顶点,而不包含权值。

頂點 A:
{B, C}

頂點 B:
{A, C}

頂點 C:
{A, D}

十字链表

十字链表是一种存储稀疏图的有效结构。十字链表由两个数组组成:一个顶点数组和一个边数组。顶点数组存储图中的所有顶点,边数组存储图中的所有边。每个边数组的元素是一个三元组,第一个元素是边的起点, вторая元素是边的终点,第三个元素是边的权值。

頂點數組:
A
B
C
D

邊數組:
(A, B, 1)
(B, C, 3)
(C, D, 4)

十字链表在存储稀疏图时非常有效,因为它只存储图中的边,而不存储与边无关的顶点信息。这可以大大减少存储空间。

存储结构的选择

图的存储结构的选择取决于图的类型和应用。对于稀疏图,十字链表是一种很好的选择。对于稠密图,邻接表或邻接集是一种更好的选择。

在选择图的存储结构时,还需要考虑以下因素:

  • 存储空间:图的存储结构应该尽可能少地占用存储空间。
  • 查询时间:图的存储结构应该支持快速地查询图中的信息。
  • 更新时间:图的存储结构应该支持快速地更新图中的信息。

总结

图的存储结构是图论的重要组成部分。不同的图存储结构有不同的特点和适用场景。在选择图的存储结构时,需要考虑图的类型、应用和存储空间、查询时间和更新时间等因素。