Skip to content

邻接表

例如下面的图:

image-20250312142302485

上面的图虽然有 5 个顶点,但是仅仅有顶点 2 连接顶点 1,如果用上面我们介绍过的邻接矩阵的方式来存储的话,就是:

[9]\left[ \begin{matrix} \infty & \infty & \infty & \infty & \infty\\ 9 & \infty & \infty & \infty & \infty\\ \infty & \infty & \infty & \infty & \infty\\ \infty & \infty & \infty & \infty & \infty\\ \infty & \infty & \infty & \infty & \infty \end{matrix} \right]

上面的二维数组,仅仅只存储了一个 9,其他空间都浪费掉了。因此这里可以考虑使用邻接表的方式来存储。

邻接表核心思想

邻接表的核心思想是使用一个 一维数组 来存储所有的顶点,因此有多少个顶点,这个一维数组的长度就是多少。数组里面的每一项是一个 链表链表会存储和该顶点连接的所有其他顶点

我们还是来看一个具体的例子,假设还是下面的有向图:

image-20250327124230602

那么使用数组存储的结构如下:

image-20250312151229515

数组的每一项,是一个链表。这里以 V1 顶点为例。V1 指向了 V2 和 V4,V2 和 V4 这两个顶点在数组中的下标分别为 1

和 3,因此整个链表如蓝色部分所示。

注意这里 V2 和 V4 并不存在具体的顺序,因此在链表中的表现也可以是下标为 3 的顶点在前面,下标为 1 的顶点在后面。

因此,上面的有向图使用邻接表来存储的话,完整的邻接表为:

image-20250312152442563

搞清楚了有向图后,无向图基本也是相同的道理,仅仅是链表的长度会更长一些,因为会包含出度和入度。例如下面的无向图:

image-20250312134803244

使用邻接表的方式来存储的话,完整的数组结构如下图:

image-20250312153104203

-EOF-