繁体   English   中英

Boost图形库-具有正好N个边/顶点的图形

[英]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 GraphAdjacency GraphVertex List GraphEdge List GraphBidirectional GraphAdjacency Matrix )。

还可以考虑使图形内存映射,这样就不必完全“加载”它,甚至不必在任何给定时间将其装入RAM中(不过要注意访问时间,这全都取决于访问模式和如何布置数据)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM