【发布时间】:2015-03-11 19:32:15
【问题描述】:
我是使用 C++ boost 库的新手,尤其是 boost 图库,它需要尝试编写一些算法,在这些算法中我通常检查两个顶点的邻接性并处理其他图概念,例如计算图不变量。
我所知道的是我们可以使用函数遍历相邻顶点:adjacent_vertices(u, g) 但我正在寻找一种有效的方法来测试两个顶点 u、v 是否相邻而不进行线性搜索
【问题讨论】:
标签: c++ boost boost-graph
我是使用 C++ boost 库的新手,尤其是 boost 图库,它需要尝试编写一些算法,在这些算法中我通常检查两个顶点的邻接性并处理其他图概念,例如计算图不变量。
我所知道的是我们可以使用函数遍历相邻顶点:adjacent_vertices(u, g) 但我正在寻找一种有效的方法来测试两个顶点 u、v 是否相邻而不进行线性搜索
【问题讨论】:
标签: c++ boost boost-graph
AdjacencyMatrix 概念提供了复杂性保证,即edge() 函数必须在恒定时间内返回。
要检查G 中的两个顶点v 和w 是否相邻,请编写edge(v, w, G).second,因为该函数返回一对,其中第二个值指示边是否存在。
edge() 函数也适用于其他图形表示。下图显示了不同表示在检查顶点邻接的性能方面的比较:
这是该情节的code used to generate the data。每个数据点是 100 个中等密度的随机图,每个图有 100 个随机边缘检查。注意对数 y 轴。
最佳选择最终将取决于您的特定应用程序,因为对于其他操作,结构按速度排序是不同的。换句话说,避免过早的优化。
【讨论】:
R 计算数据点的均值和标准差,使用plyr 包中的ddply。该图是使用gnuplot 和ColorBrewer 配色方案制作的。
edge()之外的其他操作,旧版本被覆盖了。请记住,我不打算在 gnuplot 和 R 文件中提高可读性。
BGL 是一个高度通用的库。您可以调整大多数数据结构以用于其算法。
您可以改变边缘容器。你没有提到它,但我假设你一直在查看boost::adjacency_list 的接口/复杂性保证。
确实,即使您使用setS 作为边缘容器选择器,边缘成员资格测试也是 O(n)。这主要是因为邻接列表存储传出边是每个顶点的。所以在最坏的情况下,每个顶点最多包含一个出边,搜索实际上是 O(n) [1]
在这种情况下,您只想选择另一个图形实现。
Graph Concepts 上的文档页面是了解预期哪些概念的良好起点。以及,哪些模型提供了这些概念。
在最坏的情况下,您可以调整数据结构以用于 Boost Graph 算法。例如。您可以将所有边存储在一个简单的 std::[unordered_]set<std::pair<VID, VID> > 中,并对其进行调整以模拟 EdgeListGraph 概念。
这样您将获得高效的查找。
[1] 当然,这也意味着,在最好的情况下,搜索是您的集合实现提供的任何内容:O(log n) 因为所有边都可能来自同一个顶点...
【讨论】:
adapt it to model the EdgeListGraph concept 是什么意思,我是泛型编程的新手。
hash_setS这是一个unordered_map作为边缘列表的底层容器,并找到函数edge(u, v, g)返回pair<edge_descriptor, bool>,其中bool是边缘是否存在,但我不知道hash_setS 的选择会如何影响此操作