C++ 如何存储这种图形?

C++ 如何存储这种图形?,c++,coding-style,stl,C++,Coding Style,Stl,假设我们有一个双向边的图,没有权重。我如何存储它,以便不浪费大量内存,使其快速运行,并快速访问每个顶点的邻居?我的意思是,到目前为止,对于这样的事情:{(1,2)(1,5)(1,3)(2,4)(2,3)}我一直在使用数组:数组[1][2]=1意味着1和2之间存在连接。这有两个问题: a) 由于图形是双向的,(1,2)意味着(2,1)也存在。如果我想以后方便地访问2的邻居,我必须在每次迭代中进行两次更改:array[1][2]=1,array[2][1]=1 b) 当我知道某个顶点(比如5)只剩

假设我们有一个双向边的图,没有权重。我如何存储它,以便不浪费大量内存,使其快速运行,并快速访问每个顶点的邻居?我的意思是,到目前为止,对于这样的事情:
{(1,2)(1,5)(1,3)(2,4)(2,3)}
我一直在使用数组:
数组[1][2]=1
意味着1和2之间存在连接。这有两个问题:

  • a) 由于图形是双向的,
    (1,2)
    意味着
    (2,1)
    也存在。如果我想以后方便地访问2的邻居,我必须在每次迭代中进行两次更改:
    array[1][2]=1
    array[2][1]=1

  • b) 当我知道某个顶点(比如5)只剩下一个邻居时,我必须搜索整个
    数组[5][x]
    检查所有可能的
    x

  • c) 对于一个有一百万个顶点的图形来说,这个怪物变得太大,无法在任何竞争中使用


你能帮我指出解决问题的方法吗?

你可以用三角矩阵。这意味着,比如说,如果x
有关示例,请参见和。

您可以使用三角形矩阵。这意味着,比如说,如果x
有关示例,请参见和。

看起来您需要一个集合地图

std::map

因此,对于int,可以存储集合中所有相邻元素的集合。您需要函数来操作此集合

如果节点的数量是可计数的,即它们的范围是0到N,并且包含所有这些数字,那么您可以使用
std::vector
,这样做会更有效。您还可以使用
std::vector
std::vector
,如果您有20000个节点,因此可以负担20000个2500字节的位集(加上一点开销),每个=50MB的内存(大约)

这是一个稍微更紧凑的模式,你有一个,但不是很多。如果你有一百万个顶点,它大约是125GB,所以显然你不能使用这个模型,但应该使用集合。此外,迭代一个顶点以查看它的邻居是什么,这是一个比位集更快的操作

除非有许多顶点根本没有邻域,并且它们是按顺序编号的,否则映射相对于向量并没有任何优势


不知道你称之为“吨”的内存有多少。我刚刚宣布的模型使用恒定内存,而集合映射使用的内存与您拥有的邻域关系的数量成比例,但当它变得满时,将远不如比特集向量紧凑,因此将消耗更多的内存。

看起来您需要集合映射

std::map

因此,对于int,可以存储集合中所有相邻元素的集合。您需要函数来操作此集合

如果节点的数量是可计数的,即它们的范围是0到N,并且包含所有这些数字,那么您可以使用
std::vector
,这样做会更有效。您还可以使用
std::vector
std::vector
,如果您有20000个节点,因此可以负担20000个2500字节的位集(加上一点开销),每个=50MB的内存(大约)

这是一个稍微更紧凑的模式,你有一个,但不是很多。如果你有一百万个顶点,它大约是125GB,所以显然你不能使用这个模型,但应该使用集合。此外,迭代一个顶点以查看它的邻居是什么,这是一个比位集更快的操作

除非有许多顶点根本没有邻域,并且它们是按顺序编号的,否则映射相对于向量并没有任何优势


不知道你称之为“吨”的内存有多少。我刚才提到的模型使用的是常量内存,而集合映射使用的内存与您拥有的邻域关系的数量成比例,但当它满了时,将远不如位集合向量紧凑,因此将消耗更多的内存。

这是家庭作业吗?如果是,请贴上标签!总是有。Rob-宁愿留在STL的东西上,这样花哨的库通常是不允许出现在任何比赛中的。图表都是关于权衡的。对于你的情况,稀疏矩阵对我来说很好。其他建议的答案会做的,但一定要了解STL集合,以找出自己需要什么样的结构,在内存使用,访问顶点,邻接列表等。如果你甚至一半严重的C++和图表,请看Boost图库,看看这些人如何在C++中通用地使用图形算法。这是做作业吗?如果是,请贴上标签!总是有。Rob-宁愿留在STL的东西上,这样花哨的库通常是不允许出现在任何比赛中的。图表都是关于权衡的。对于你的情况,稀疏矩阵对我来说很好。其他建议的答案会做的,但一定要了解STL集合,以找出自己需要什么样的结构,在内存使用,访问顶点,邻接列表等。如果你甚至一半严重的C++和图表,请看Boost图库,看看这些人是如何在C++中通用的图形算法。对于我目前的技术来说,看起来相当复杂,但谢谢:)对于我目前的技术来说,这相当复杂,但是谢谢: