邻接链表与邻接矩阵的一些比较

808 阅读2分钟

前言

写了拓扑排序一文之后,发觉自己对图的两种基本表示方式了解不够深刻。写下此文来记录一下。 计算机研究的很多复杂问题都可以归类为图论问题,如单源最短路径问题,最小生成树问题,网络最大流问题等。而要让计算机能够处理这些问题,我们必须能够将图表现为计算机能够理解的形式。而邻接链表与邻接矩阵便是计算机内表示图的两种最常见的方式。

正文

算法导论中提到,对于图 G = (V,E )而言,邻接链表在稀疏图(边的条数|E| << |V|^2)下更推荐使用,在稠密图(边的条数|E|接近于|V|^2)的情况下,更加建议使用邻接矩阵。在我看来,这两种方式存储其实都冗余了信息,邻接链表是节点 a如果与多个节点都有关联,那么节点a会重复出现在多个节点的链表中,邻接矩阵则是存储了节点不相连的信息,而这个信息,邻接链表是不消化的。

而除了这个之外,邻接链表和邻接矩阵还有以下几个方面的区别。

  1. 邻接链表的扩展性更好,书中的专业术语是鲁棒性,这两个在某些时候可以认为是同义,如果需要增加属性,可以通过简单修改就可以支持。
  2. 邻接链表无法快速判断一条边(u,v)是否图中的一条边,而邻接矩阵可以。
  3. 如果是无权重的图,邻接矩阵还有一个优势,就是每个记录项只需要 1 位的空间。
  4. 如果是无向无权重图,因为矩阵的对称性,只需要存放对角线及其上的半个矩阵,可节省一半的存储空间。

具体使用的时候还是要因地制宜,并且就算是邻接链表也是有着多种实现方案的。

参考资料

  1. 邻接矩阵
  2. 邻接链表