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