Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graph 保持图形的有效方法(二维数组)_Graph_Multidimensional Array_Memory Efficient - Fatal编程技术网

Graph 保持图形的有效方法(二维数组)

Graph 保持图形的有效方法(二维数组),graph,multidimensional-array,memory-efficient,Graph,Multidimensional Array,Memory Efficient,是否有人知道在内存空间或构建时间方面保存图形信息的更有效方法(即,比将其保存为二维数组更有效) 可以假定其值限制在0-255之间 塔克斯 如果图形相当稀疏,则可以通过将其存储为边列表(从节点到节点)而不是邻接矩阵来节省空间。如果所有边都是双向的,那么您只需要将任何边存储一次。如果图形非常稀疏,那么您可以通过将其存储为边列表(从节点到节点)而不是邻接矩阵来节省空间。如果所有边都是双向的,那么您只需要将任何边存储一次。以下是表示(定向)图形的几种标准方法: 对于包含4个节点的图形: 邻接矩阵:

是否有人知道在内存空间或构建时间方面保存图形信息的更有效方法(即,比将其保存为二维数组更有效)

可以假定其值限制在0-255之间


塔克斯

如果图形相当稀疏,则可以通过将其存储为边列表(从节点到节点)而不是邻接矩阵来节省空间。如果所有边都是双向的,那么您只需要将任何边存储一次。

如果图形非常稀疏,那么您可以通过将其存储为边列表(从节点到节点)而不是邻接矩阵来节省空间。如果所有边都是双向的,那么您只需要将任何边存储一次。

以下是表示(定向)图形的几种标准方法:

对于包含4个节点的图形:

邻接矩阵:

  0  1  2  3 
0 F  F  T  F
1 T  F  T  T
2 T  F  F  F
3 F  F  F  F
边缘列表:

((0, 2), (1, 0), (1, 2), (1, 3), (2, 0))
邻接列表:

(
 (0, (2,)     ), 
 (1, (0, 2, 3)), 
 (2, (0,)     ),
 (4, (,)      ),
)
邻接矩阵是简单且最快的表示形式,但占用的内存最多(N*N,其中N是行数),除非图形非常密集。如果您只有一个简单的未加权图,则可以通过使用位数组节省一些内存

边列表很简单,但比邻接矩阵慢,如果您有一个稀疏图(2*M,其中M是边的数目),那么它的内存效率很高

邻接列表稍微复杂一些(因为您需要可变大小的数组),但是如果您有大量的边(2*N+M,其中N是顶点的数量,M是边的数量),那么它比边列表的内存效率更高

邻接矩阵占用(NNb)空间。边缘列表占用((2+b)*N)内存。邻接列表占用(2*N+M*(1+b))内存


如果知道顶点数始终小于256(8位),且权重小于256(8位),则邻接矩阵将占用(N*N*8)空间。边缘列表占用(24*N)内存。邻接列表占用(16*N+M*16)内存

以下是表示(有向)图形的几种标准方法:

对于包含4个节点的图形:

邻接矩阵:

  0  1  2  3 
0 F  F  T  F
1 T  F  T  T
2 T  F  F  F
3 F  F  F  F
边缘列表:

((0, 2), (1, 0), (1, 2), (1, 3), (2, 0))
邻接列表:

(
 (0, (2,)     ), 
 (1, (0, 2, 3)), 
 (2, (0,)     ),
 (4, (,)      ),
)
邻接矩阵是简单且最快的表示形式,但占用的内存最多(N*N,其中N是行数),除非图形非常密集。如果您只有一个简单的未加权图,则可以通过使用位数组节省一些内存

边列表很简单,但比邻接矩阵慢,如果您有一个稀疏图(2*M,其中M是边的数目),那么它的内存效率很高

邻接列表稍微复杂一些(因为您需要可变大小的数组),但是如果您有大量的边(2*N+M,其中N是顶点的数量,M是边的数量),那么它比边列表的内存效率更高

邻接矩阵占用(NNb)空间。边缘列表占用((2+b)*N)内存。邻接列表占用(2*N+M*(1+b))内存


如果知道顶点数始终小于256(8位),且权重小于256(8位),则邻接矩阵将占用(N*N*8)空间。边缘列表占用(24*N)内存。邻接列表占用(16*N+M*16)内存

如果创建后不需要修改图形,请查看压缩稀疏行(CSR)格式。描述来自:

CSR格式存储顶点和顶点 在单独阵列中的边 索引到这些数组中 对应于的标识符 分别是顶点或边。这个 边数组是按数据源排序的 每个边,但仅包含 边缘的目标。顶点 数组将偏移存储到边中 数组,提供 从每个顶点传出的第一条边。 对输出边进行迭代 图中的第i个顶点是通过 访问边数组[顶点数组[i]], 边数组[顶点数组[i]+1]。。。, 边数组[顶点数组[i+1]]。这 格式最大限度地减少了O(n)的内存使用+ m) ,其中n和m是 分别为顶点和边。这个 乘以n和m的常数为 基于整数的大小 需要将索引表示为 分别为边和顶点数组(…)

这是对偏移阵列的一个很好的解释:

有效插入边 创建后允许插入边可以通过将
邻域
数组放入“链表”来实现。偏移点 进入第一个邻居,每个邻居包含一个
Next
字段。这指向下一条边

来自同一来源:


如果创建后不需要修改图形,请查看压缩稀疏行(CSR)格式。描述来自:

CSR格式存储顶点和顶点 在单独阵列中的边 索引到这些数组中 对应于的标识符 分别是顶点或边。这个 边数组是按数据源排序的 每个边,但仅包含 边缘的目标。顶点 数组将偏移存储到边中 数组,提供 从每个顶点传出的第一条边。 对输出边进行迭代 图中的第i个顶点是通过 访问边数组[顶点数组[i]], 边数组[顶点数组[i]+1]。。。, 边数组[顶点数组[i+1]]。这 格式最大限度地减少了O(n)的内存使用+ m) ,其中n和m是 分别为顶点和边。这个 乘以n和m的常数为 基于整数的大小 需要将索引表示为 分别为边和顶点数组(…)

这是对偏移阵列的一个很好的解释:

有效插入边 创建后允许插入边可以通过将
邻域
数组放入“链表”来实现。偏移点 进入第一个邻居,每个邻居包含一个
Next
字段。这指向下一条边

来自同一来源:


这里有一个我发现很有用的图形表示列表:

有一个图表列表