使用 stl 的 C++ 中图形实现的比较
Comparison of Graph implementation in C++ using stl
为了实现一个图,我们可以使用列表向量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)。根据您的目的,您可以使用一个而不是另一个。尽管您应该注意,当您使用连续的内存空间(如矢量)时,存在缓存优化等。然而,我对此知之甚少,但还有其他答案提到了它:矢量或地图,使用哪一个?
- 三向比较运算符成员与非成员实现
- std::max() 函数与定点实现的比较中的问题
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 如何实现 Boost.Hana 结构的相等比较运算符?
- 为什么sub_match和basic_string比较运算符使用额外的字符串副本实现?
- 为什么地图需要实现'operator<'以及如何比较对象?
- 如何实现通用比较?(用于数字和字符串)
- 为 RocksDB 实现一个比较器
- 比较器的两个实现之间的差异
- std::unordered_map如何存储和比较其密钥,以实现无需订购即可快速访问元素?
- 如何准确测量和比较opencl速度以实现循环功能的简单速度
- 如何实现分类比较器,以级联相关对象
- 如何在不使用 lambda 表达式的情况下实现特定的比较器
- 如何实现 std::map::查找包含两个结构'Pos'结构的比较逻辑,每个结构包含 x 和 y 坐标
- 定制比较器,用于使用多种排序键来实现排序
- 如何为结构/类字符串实现比较操作员
- 算法实现与 C++ 和 PHP 进行比较
- 使用模板实现排序.如何使用比较器
- 哪个C++库提供了一个带有任何类型的键的映射,该键不强制实现比较函数
- 实现比较运算符的模板类