我在使用C ++ boost库时特别喜欢使用升级图库,这需要尝试编码一些算法,我通常检查两个顶点的邻接并处理其他图形概念,如计算图形不变量。
我所知道的是,我们可以使用函数迭代相邻顶点:adjacent_vertices(u, g)
但是我正在寻找一种有效的方法来测试两个顶点u,v是否相邻而不进行线性搜索
答案 0 :(得分:5)
AdjacencyMatrix概念提供了复杂性保证edge()
函数必须在恒定时间内返回。
要检查v
中是否有两个顶点w
和G
相邻,请编写edge(v, w, G).second
,因为该函数返回一对,其中第二个值指示是否为边缘存在。
edge()
函数也用于其他图形表示。下面的图表显示了不同的表示与检查顶点邻接性能的比较:
这是该情节的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),因为所有边都可以来自同一个顶点......