增强图:测试两个顶点是否相邻

时间:2015-03-11 19:32:15

标签: c++ boost boost-graph

我在使用C ++ boost库时特别喜欢使用升级图库,这需要尝试编码一些算法,我通常检查两个顶点的邻接并处理其他图形概念,如计算图形不变量。 我所知道的是,我们可以使用函数迭代相邻顶点:adjacent_vertices(u, g)但是我正在寻找一种有效的方法来测试两个顶点u,v是否相邻而不进行线性搜索

2 个答案:

答案 0 :(得分:5)

AdjacencyMatrix概念提供了复杂性保证edge()函数必须在恒定时间内返回。

要检查v中是否有两个顶点wG相邻,请编写edge(v, w, G).second,因为该函数返回一对,其中第二个值指示是否为边缘存在。

edge()函数也用于其他图形表示。下面的图表显示了不同的表示与检查顶点邻接性能的比较:

Adjacency check efficiency

这是该情节的code used to generate the data。每个数据点是100个中密度随机图,每个图有100个随机边缘检查。注意对数 y 轴。

最佳选择最终取决于您的特定应用,因为对于其他操作,结构的速度顺序是不同的。换句话说,避免过早优化。

答案 1 :(得分:2)

BGL是一个高度通用的库。您可以调整大多数数据结构以与其算法一起使用。

您可以更改边缘容器。你没有提到它,但我假设你一直在关注boost::adjacency_list的接口/复杂性保证。

实际上,即使您对边缘容器选择器使用setS,边缘成员资格测试也将为O(n)。这主要是因为邻接列表存储每个顶点的传出边。所以在最坏的情况下,每个顶点最多只包含一个出边,搜索实际上是O(n)[1]

在这种情况下,您只想选择另一个图表实现。

Graph Concepts 上的文档页面是了解预期哪些概念的良好起点。以及哪些模型提供这些概念。

在最坏的情况下,您可以调整数据结构以用于Boost Graph算法。例如。您可以将所有边缘存储在一个简单的std::[unordered_]set<std::pair<VID, VID> >中,并对其进行调整以模拟 EdgeListGraph 概念。

这样你就可以进行高效的查找。


[1]当然这也意味着,在最好的情况下,搜索是你的set实现提供的任何东西:O(log n),因为所有边都可以来自同一个顶点......