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的邻居,我必须在每次迭代中进行两次更改:(2,1)
,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++中通用的图形算法。对于我目前的技术来说,看起来相当复杂,但谢谢:)对于我目前的技术来说,这相当复杂,但是谢谢: