使用stl进行C ++中图形实现的比较

时间:2013-10-27 06:40:35

标签: c++ graph stl

要实现图表,我们可以使用列表矢量std::vector<std::list<vertex>> 但我已经看到某个地方,如果使用这样的std::map<vertex, std::set<vertex>>地图,那么我们可以做得更好。任何人都可以在内存或速度方面找出它比第一个更好的选择吗?

1 个答案:

答案 0 :(得分:1)

这里有两点不同之处。

std::vector<std::list<vertex>>是所谓的“邻接列表”,而std::map<vertex, std::set<vertex>>被称为“邻接集”,增加的区别在于使用a进行顶点数组索引的散列map代替vector。我先谈谈第一个差异(即list<vertex> vs set<vertex>)。

第一个实现基本上是链表的数组,其中每个链表给出了与顶点相邻的所有顶点。第二种实现是将每个顶点映射到一组相邻顶点的有序映射。

邻接列表与邻接集的比较增长顺序:

空格:(E + V)vs(E + V)

添加边缘:1对比log V

检查邻接度:(检查顶点的程度)vs log V

通过顶点的邻居迭代:(顶点检查的程度)vs(log V +顶点检查的程度)

...其中E是边数,V是顶点数,顶点的度数是连接到它的边数。 (我使用的是无向图的语言,但你可以对有向图进行类似的推理)。因此,如果你有一个非常密集的图形(每个顶点有很多边,即高度),那么你想使用邻接集。

关于map vs vector的使用:insert和erase是vector的O(N)和map的O(log N)。但是,对于向量,查找是O(1),对于映射,查找是O(log N)。根据您的目的,您可以使用一个而不是另一个。虽然您应该注意到存在缓存优化等,但是当您使用连续的内存空间时(如矢量那样)。然而,我对此并不了解,但还有其他答案提到它:vector or map, which one to use?