C++ boost::子图是如何工作的?我们可以使用过滤图吗?
我使用boost::subgraph,想知道它是如何工作的C++ boost::子图是如何工作的?我们可以使用过滤图吗?,c++,boost,graph,C++,Boost,Graph,我使用boost::subgraph,想知道它是如何工作的 Graph G; add_vertex(A, G); add_vertex(B, G); add_vertex(C, G); add_edge(A, B, G); add_edge(A, C, G); add_edge(C, B, G); Graph &G0 = G.createSubgraph(); add_vertex(A, G0); add_vertex(B, G0); G0的内存成本是多少?我想G0必须存储为G0添加的
Graph G;
add_vertex(A, G);
add_vertex(B, G);
add_vertex(C, G);
add_edge(A, B, G);
add_edge(A, C, G);
add_edge(C, B, G);
Graph &G0 = G.createSubgraph();
add_vertex(A, G0);
add_vertex(B, G0);
G0的内存成本是多少?我想G0必须存储为G0添加的所有顶点。G0是否也需要在G0上存储边
当遍历G0时,我们实际上是在G上遍历吗?
对于每条边,我们需要检查其目标节点是否位于G0上。如果不是,则跳过该节点。所以我们有额外的支票费用。它是如何工作的
Boost也有过滤图
我们如何决定使用子图还是过滤图
谢谢,
你的参考问题是C++问题,与Boost图无关。 您不能创建未绑定的引用(也不能重新绑定)。赋值将分配引用的对象 因此,原则上,您拥有但已修复的:Graph G;
add_vertex(A, G);
add_vertex(B, G);
add_vertex(C, G);
add_edge(A, B, G);
add_edge(A, C, G);
add_edge(C, B, G);
Graph& G0 = G.createSubgraph();
add_vertex(A, G0);
add_vertex(B, G0);
我建议多读一些C++,因为当你使用一个高级的类库(如Boost图)时,不知道语言的本质会给你带来麻烦。
建议如下:
更新
算法的复杂性不受影响,但常数可以预期随着子图树的深度线性增加
子图的工作机制不是很复杂(只是大量代理)。关键在于映射存储在非根子图中的方式:
Graph m_graph;
subgraph<Graph>* m_parent;
edge_index_type m_edge_counter; // for generating unique edge indices
ChildrenList m_children;
GlobalVertexList m_global_vertex; // local -> global
LocalVertexMap m_local_vertex; // global -> local
GlobalEdgeList m_global_edge; // local -> global
LocalEdgeMap m_local_edge; // global -> local
图m\u图;
子图*m_父图;
edge_index_type m_edge_计数器;//用于生成唯一的边索引
儿童名单m_儿童;
GlobalVertexList m_global_vertex;//局部->全局
LocalVertexMap m_local_vertex;//全局->局部
GlobalEdge列表m_global_edge;//本地->全局
LocalEdgeMap m_local_edge;//全局->局部
正如您所看到的,将子图描述符映射到父(“本地全局”)描述符有相当大的开销
事情到底有多糟糕取决于用例,您需要对其进行分析:
- 随着子图嵌套得越深,性能将受到更大的影响
- 随着子图相对于父图变得更大,内存消耗将更成比例地增加
- 属性越小,内存使用的差异就越明显
- 如果突变发生在嵌套较低的子图上,涟漪效应将产生更多的减速效应
- 在根图的VertexContainer上使用
,通常会导致插入/删除时间缩短vecS
- 然而,对于迭代来说,优势在于
对于内存局部性vecS
- 查找/转换映射无论如何都会损害位置,无法自定义
- 子图对某些集合使用向量存储,因此与向量相关的失效/重新分配成本存在
- 在根图的VertexContainer上使用