我使用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添加的所有顶点。 G0是否还需要在G0上存储边缘。
当遍历G0时,我们实际上是否遍历G? 对于每个边缘,我们需要检查其目标节点是否在G0上。如果没有,我们跳过该节点。所以我们有额外的支票费用。它是如何工作的?
Boost也有过滤图 http://www.boost.org/doc/libs/1_55_0/libs/graph/doc/filtered_graph.html 我们如何决定使用子图或过滤图?
谢谢,
答案 0 :(得分:2)
您的引用问题是C ++问题,与Boost Graph无关。
您无法创建未绑定的引用(也无法重新绑定它。分配会指定引用的对象。
原则上你所拥有的,但修复了:
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等高级通用库时,不了解语言要点会导致很多麻烦。
建议阅读:The Definitive C++ Book Guide and List
算法的复杂性没有受到影响,但可以预期常数会随着子图树的深度线性增加。
子图工作的机制并不是很复杂(它只是很多代理)。关键在于映射存储在非根子图中的方式:
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
正如您所看到的,将子图描述符映射到父(&#34; local global&#34;)描述符的开销很大。
事情究竟有多糟糕取决于用例,你需要对其进行分析:
如果在较低嵌套的子图上发生突变,则涟漪效应将具有更多的减速效果。有趣的是
vecS
的VertexContainer通常会导致更糟的插入/删除时间; vecS
用于内存位置我认为两种效果都会减少: