boost :: subgraph如何工作?我们可以使用过滤图吗?

时间:2015-06-10 13:29:07

标签: 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添加的所有顶点。 G0是否还需要在G0上存储边缘。

当遍历G0时,我们实际上是否遍历G? 对于每个边缘,我们需要检查其目标节点是否在G0上。如果没有,我们跳过该节点。所以我们有额外的支票费用。它是如何工作的?

Boost也有过滤图   http://www.boost.org/doc/libs/1_55_0/libs/graph/doc/filtered_graph.html 我们如何决定使用子图或过滤图?

谢谢,

1 个答案:

答案 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用于内存位置

    我认为两种效果都会减少:

    • 查找/翻译地图无论如何都会伤害地方,无法自定义
    • 子图表无论如何都会对某些集合使用矢量存储;所以与矢量相关的失效/重新分配成本就在那里