这可能是一个相当新手甚至是错误的问题所以请原谅。有没有办法比较使用Boost Graph Library创建的2个图表=>在内存中创建了1个图表,从存档中加载了第2个图表(即先前已将第2个序列化)?
我没有在BGL的文档中看到运算符==,但不确定这是否意味着我必须同时编写遍历和比较。任何指向教程,参考页面或样本的指针都是最有帮助的
提前致谢 内甚
答案 0 :(得分:6)
Boost.Graph可以执行此操作,但不能使用==运算符:http://www.boost.org/doc/libs/1_39_0/libs/graph/doc/isomorphism.html
这是一个难题,所以大型图表需要很长时间。
答案 1 :(得分:5)
在一般情况下,Graph Equality是一个在多项式时间内不易处理的问题;实际上,这意味着在合理的时间内解决它可能是有效的(尽管不知道是NP - 完整)。但是,如果你担心顶点标签也是相同的,那么迭代两个图中的所有边都是足够的,并确保每个边都在另一个图中。
编辑:如果顶点标签(与每个顶点相关联的值)在两个图上都相同,并且是唯一且可比的,我们可以检查O中的同构(V lg V + E lg E )很容易,就像这样:
If |G1| != |G2|, the graphs are non-equal. Abort.
i = 0
For each vertex V in G1:
G1_M[Label(V)] = V
G1_I[V] = i
i = i + 1
For each vertex V in G1:
G1_E[V] = sort(map(λDestination -> G1_I[Destination]) Edges[V])
For each vertex V in G2:
If G1_M[Label(V)] does not exist, the graphs are non-equal. Abort.
G2_corresp[V] = G1_M[Label(V)]
G2_I[V] = G1_I[G2_corresp[V]]
For each vertex V in G2:
G1_E[V] = sort(map(λDestination -> G2_I[Destination]) Edges[V])
Compare G1_E[G2_corresp[V]] and G2_E[V]. If non-equal, the graphs are non-equal. Abort.
If we get here, the graphs are equal.