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

Comparison of Graph implementation in C++ using stl

本文关键字:实现 比较 图形 C++ stl 使用      更新时间:2023-10-16

为了实现一个图,我们可以使用列表向量std::vector<std::list<vertex>>但我在某处看到过,如果使用这样的地图std::map<vertex, std::set<vertex>>那么我们可以做得更好。任何人都可以弄清楚这在内存或速度方面比第一个更好的选择吗?

这里有两个区别需要注意。

std::vector<std::list<vertex>>就是所谓的"邻接列表",std::map<vertex, std::set<vertex>>被称为"邻接集",但额外的区别是使用map而不是vector对顶点数组索引进行哈希处理。我将首先讨论第一个区别(即list<vertex>set<vertex>)。

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

邻接列表

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

空间:(E + V) 与 (E + V)

添加边缘:1 与日志 V

检查邻接:(检查的顶点度)与日志 V

遍历顶点的相邻点:(检查的顶点度)与(log V + 检查的顶点度)

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

关于地图与矢量的使用:插入和擦除是 O(N) 代表矢量,O(log N) 代表地图。然而,向量的查找是O(1),映射的查找是O(log N)。根据您的目的,您可以使用一个而不是另一个。尽管您应该注意,当您使用连续的内存空间(如矢量)时,存在缓存优化等。然而,我对此知之甚少,但还有其他答案提到了它:矢量或地图,使用哪一个?