Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::子图是如何工作的?我们可以使用过滤图吗?_C++_Boost_Graph - Fatal编程技术网

C++ boost::子图是如何工作的?我们可以使用过滤图吗?

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添加的

我使用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也有过滤图 我们如何决定使用子图还是过滤图


谢谢,

你的参考问题是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
      对于内存局部性
    我认为这两种影响都会减轻:

    • 查找/转换映射无论如何都会损害位置,无法自定义
    • 子图对某些集合使用向量存储,因此与向量相关的失效/重新分配成本存在

感谢您修复我的代码。我们无法创建“未定义”的引用。我已将您的更改应用于我的原始问题。修复后,我们可以关注我的问题。创建/迭代子图需要多少内存/时间?哦。最好不要包含太多损坏的代码:S事实证明,它会分散很多注意力(过于宽泛)问题。更新我的答案位过滤图和子图一起具有不同的功能。因此,您可以根据自己的要求/需要来决定。