[英]Boost Graph Library - Graph with exactly N Edges/Vertex
我使用BGL邻接表描绘了一个非常规则的图,我确切地知道每个顶点都有N条边。
这是我的图形定义:
typedef boost::vecS OutEdgeList;
typedef boost::vecS VertexList;
typedef boost::no_property GraphProperties;
typedef boost::vecS EdgeList;
// Graph definition
typedef boost::adjacency_list<
OutEdgeList,
VertexList,
boost::undirectedS,
VertexProperties,
EdgeProperties,
GraphProperties,
EdgeList
> Graph;
Graph g;
我使用vector / vecS来存储连接,并且我想通过天真地调用boost::add_edge
使列表按需要矢量的大小进行调整,其大小是其上一次大小的两倍。
该图使用大量RAM(〜12GiB),并且当说N = 9保留16个连接时,我不希望该向量。
有没有一种内存有效的方法来预先初始化邻接列表容器,例如
for(auto edgesOfVert:edgesOfVerts)
edgesOfVert.reserve(N);
还是另一种利用图形的规律性来节省内存的方法?
感谢您的任何建议!
编辑:作为一种可能的解决方案,我发现了这一点,但我同意sehe的做法,并考虑保留适当数量的有边的不雅元素,因为它试图强制使用不是为我需要的特定任务而设计的数据结构
真正的解决方案是不使用boost::adjacency_list
。 相反,改编自己的数据结构以对所需的Graph概念建模。
例如,Boost Graph库中有grid_graph<>
模型(如果我没记错的话)根本不使用任何顶点存储,并且确实知道提前知道所有节点之间将存在多少条边。
您仍然可以使用适用于建模图概念的所有图算法( grid_graph<>
模型grid_graph<>
Incidence Graph
, Adjacency Graph
, Vertex List Graph
, Edge List Graph
, Bidirectional Graph
, Adjacency Matrix
)。
还可以考虑使图形内存映射,这样就不必完全“加载”它,甚至不必在任何给定时间将其装入RAM中(不过要注意访问时间,这全都取决于访问模式和如何布置数据)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.