数据结构 | 第6章 邻接表

236 阅读2分钟

6.4 邻接表

原理:

邻接矩阵的空间效率之所以低,是因为其中大量单元所对应的边,通常并未在图中出现。因静态空间管理策略导致的此类问题,并非首次出现,比如此前的2.4节,就曾指出这类缺陷并试图改进。既然如此,为何不仿照3.1节的思路,将这里的向量替换为列表呢?

image-20220713193924177.png

以如图6.6(a)所示的无向图为例,只需将如图(b)所示的邻接矩阵,逐行地转换为如图(c)所示的一组列表,即可分别记录各顶点的关联边(或等价地,邻接顶点)。这些列表,也因此称作邻接表(adjacency list)。实际上,这种通用方法不难推广至有向图。

复杂度:

邻接表所含列表数等于顶点总数n,每条边在其中仅存放一次(有向图)或两次(无向图),故无向图的空间复杂度为O(n+2e);有向图的空间复杂度为O(n+e),与图自身的规模相当,较之邻接矩阵有很大改进。

总结:

当然,空间性能的这一改进,需以某些方面时间性能的降低为代价。比如,为判断顶点v到u的联边是否存在,exists(v, u)需在v对应的邻接表中顺序查找,共需O(n)时间。

与顶点相关操作接口,时间性能依然保持,甚至有所提高。比如,顶点的插入操作,可在O(1)而不是O(n)时间内完成。当然,顶点的删除操作,仍需遍历所有邻接表,共需O(2e)(无向)或O(e)(有向)时间。

尽管邻接表访问单条边的效率并不算高,却十分擅长于以批量方式,处理同一顶点的所有关联边。在以下图遍历等算法中,这是典型的处理流程和模式。比如,为枚举从顶点v发出的所有边,现在仅需Θ(1 + outDegree(v))而非Θ(n)时间。故总体而言,邻接表的效率较之邻接矩阵更高。因此,本章对以下各算法的复杂度分析,多以基于邻接表的实现方式为准。

PS:虽然但是,O(n+2e)可能写做O(n+e),O(2e)可能写做O(e)

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情