这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记
今天回顾一下图的存储方式,有 邻接矩阵、邻接表、十字链表、多重链表 四种,这里仅介绍邻接矩阵和邻接表
邻接矩阵
邻接矩阵是表示顶点之间相邻关系的矩阵, 它采用两个数组分别来存储图的顶点和边的信息,其中用一个一维数组来存储顶点信息,一个二维数组来存储边的信息。事实上,邻接矩阵主要指的是这个二维数组
可以看出邻接矩阵有以下特点:
-
存储空间。由于无向图的邻接矩阵是对称矩阵,采用特殊矩阵的压缩存储即下三角矩阵即可完成。因此n个顶点的无向图只需要n(n-1)/2个空间即可。但是对于有向图而言,邻接矩阵不一定对称,所以任需要 n*n 个空间
-
查询两点是否有边时,根据邻接矩阵中元素的值可以方便判定图或图中顶点与顶点之间是否有关联,另外对于求解各个顶点的度也是非常方便。
对于无向图:第i个顶点的度就等于矩阵中第i行非0元素的个数
对于无向图:第i个顶点的出度就等于矩阵中第i行非0元素的个数
第i个顶点的入度就等于矩阵中第i列非0元素的个数
邻接表
当图中的边数远远小于图的顶点数,即为稀疏图,邻接矩阵就成为稀疏矩阵,此时用邻接矩阵存储图就会造成空间的浪费,一个好的解决方法就是采用邻接表。
邻接表是图的链式存储结构,克服了邻接矩阵的缺点,只存储顶点之间有关联的信息。
邻接表的特点:
存储空间。对于有 n 个顶点 e 条边d的无向图,采用邻接表存储,需要n个表头结点和2e个表姐点,显然在稀疏图中邻接表比邻接矩阵占用的存储空间更少。
对于无向图第i个节点的度等于第i个单链表上节点个数。但是对于有向图要求第i个节点的入度个数必须遍历整个邻接表。所以为了方便这种操作,可以为图建立一个逆邻接表,与邻接表结构相同,只是边表中每个节点存放的是该顶点通过入度弧所连接的所有顶点,如图: