挑战408 |
您所在的位置:网站首页 › 邻接矩阵的计算公式 › 挑战408 |
图的存储方式
在实践中,存储图最常见的策略是: 将每个节点的连接存储在邻接列表中。将整个图形的连接存储在邻接矩阵中。 用邻接链表来表示图之间的关系在图中表示连接的最简单方法是在每个节点的数据结构中存储与其连接的节点的列表。该结构称为邻接列表。 例如,在航空公司图表中
虽然临接表提供了一种表示图形中连接的便捷方式,但是当操作需要搜索与节点关联的节点时,它的效率可能会低下。 例如,如果使用邻接列表表示,则确定是两个节点是否相互连接需要O(D)时间,其中D表示节点之间的度。 如果图中的节点都具有少量邻居,则搜索该列表的成本很小。 但是,如果图中的节点往往具有大量邻居,则此成本变得很高。 如果效率成为一个很关心的问题,那么我们可以通过在称为邻接矩阵的二维数组中表示节点之间的花费(即权重),该数组显示哪些节点已连接。 航空公司图的邻接矩阵如下所示: 要使用邻接矩阵,必须将每个节点与其索引号相关联,该索引号指定该表中与该节点对应的列或行号。 作为图的具体结构的一部分,实现需要为图中的每个节点分配一行和一列的二维数组。 数组的元素是布尔值。 如果matrix [start] [finish]中的条目为真,则图中就有表示 start→finish的节点间的关系。 两种表示方式的空间复杂度就执行时间而言,使用邻接矩阵比使用邻接列表快得多。 但另一方面,矩阵需要O(N^2)存储空间(如果不压缩),其中N是节点的数量。 对于大多数图形,邻接列表表示在空间方面往往更有效。 在邻接列表表示中,每个节点都有一个连接列表,在最坏的情况下,它的长度将是Dmax,其中Dmax是图中任一节点的最大度数,即从单个节点出发的最大连接数。 因此,邻接列表的空间成本是O(N×Dmax)。 如果大多数节点彼此连接,则Dmax将相对接近N,这意味着表示连接的成本对于两种方法是相近的的。 另一方面,如果图形包含许多节点但相对较少的互连(称为稀疏矩阵),则邻接列表表示可以节省相当大的空间。 除此之外,图的存储方式还有邻接多重表和十字链表法。 特点: 由上述可以看出,通常我们可以将边的类型定义为0或者1的枚举类型。无向图的邻接矩阵一定是对称矩阵(且唯一),对于规模较大的矩阵可以进行压缩。当图的边数较多的时候,适合采用邻接矩阵表示。反之当边数较少的时候适合采用邻接链表。 矩阵压缩我们刚刚提到 ,对于规模较大的对称矩阵可以考虑进行压缩。那么什么是压缩呢? 压缩存储,是指为多个值相同的元素只分配一个存储空间,并且对于0元素不分配空间。其目的就是要节省存储空间。我们通常可以对一些特殊的矩阵进行压缩。下面着重介绍三种(只考虑方阵)。 对称矩阵定义:对于一个n阶方阵A[1…n][1…n],中的任意一个元素Aij,满足: Aij = Aji //其中 1 1(即行-列的绝对值大于1)的时候,有 a(i,j)= 0,那么矩阵A就被称为三对角矩阵。在三对角矩阵中,所有的主要元素都集中在以主对角线为中心的3条对角线中,其他区域的数值均为0.![]() ![]() 反推,已知元素位置为k,那么其下标为: i = [(k+1) /3 +1] //中括号的意思是向下取整 j = k - 2i +3 //这里是求主元素下标公式的逆推 稀疏矩阵这个很容易理解,就不用什么官方定义了,就是矩阵中,非零元素非常少的矩阵。(比如一个100 x 100的矩阵中,只有不到100个非零元素)。这种矩阵就是稀疏矩阵。 对于这种矩阵的存储也很好办,只要我们存储非零元素就好了。如果将行,列,值三者组成一个三元组,那么三元组的格式就是(行,列,值)。将其存在数组下标就很好办: 这个也不看具体的公式定义,先上图: 用LOC(a(0,0))表示数组在内存中表示的物理位置,L表示每个元素的存储空间,那么a(i,j)的物理位置为(从0开始算): 原理同上,放图自己分析: |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |