数据结构——图(2)——图的存储和表示方式.md

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/redRnt/article/details/82942851

图的存储方式

在实践中,图最常见的策略是:

  • 将每个节点的连接存储在邻接列表中。
  • 将整个图形的连接存储在邻接矩阵中。

用邻接链表来表示图之间的关系

在图中表示连接的最简单方法是在每个节点的数据结构中存储与其连接的节点的列表。该结构称为邻接列表。 例如,在航空公司图表中
在这里插入图片描述
每一个节点连接的相邻节点构成一个邻接表,就像这样:
在这里插入图片描述

使用邻接矩阵表示节点间的关系

虽然临接表提供了一种表示图形中连接的便捷方式,但是当操作需要搜索与节点关联的节点时,它的效率可能会低下。 例如,如果使用邻接列表表示,则确定是两个节点是否相互连接需要O(D)时间,其中D表示节点之间的度。 如果图中的节点都具有少量邻居,则搜索该列表的成本很小。 但是,如果图中的节点往往具有大量邻居,则此成本变得很高。
如果效率成为一个很关心的问题,那么我们可以通过在称为邻接矩阵的二维数组中表示节点之间的花费(即权重),该数组显示哪些节点已连接。 航空公司图的邻接矩阵如下所示:

在这里插入图片描述
通常X部分我们用∝表示,意思是两个节点之间没有直接关联。
特别的,当图为无向图是,邻接矩阵是对称的(如上图所示),因为每个相邻节点之间有相互的关系。(这个时候,如果矩阵很大,可以采取压缩矩阵的方式将矩阵压缩。矩阵的压缩后面会提到)
要使用邻接矩阵,必须将每个节点与其索引号相关联,该索引号指定该表中与该节点对应的列或行号。 作为图的具体结构的一部分,实现需要为图中的每个节点分配一行和一列的二维数组。 数组的元素是布尔值。 如果matrix [start] [finish]中的条目为真,则图中就有表示 start→finish的节点间的关系。

两种表示方式的空间复杂度

就执行时间而言,使用邻接矩阵比使用邻接列表快得多。 但另一方面,矩阵需要O(N^2)存储空间(如果不压缩),其中N是节点的数量。 对于大多数图形,邻接列表表示在空间方面往往更有效。 在邻接列表表示中,每个节点都有一个连接列表,在最坏的情况下,它的长度将是Dmax,其中Dmax是图中任一节点的最大度数,即从单个节点出发的最大连接数。 因此,邻接列表的空间成本是O(N×Dmax)。 如果大多数节点彼此连接,则Dmax将相对接近N,这意味着表示连接的成本对于两种方法是相近的的。 另一方面,如果图形包含许多节点但相对较少的互连(称为稀疏矩阵),则邻接列表表示可以节省相当大的空间。

除此之外,图的存储方式还有邻接多重表和十字链表法。

猜你喜欢

转载自blog.csdn.net/redRnt/article/details/82942851