【问题标题】:What is the best data structure to represent a multigraph using STL in C++?在 C++ 中使用 STL 表示多图的最佳数据结构是什么?
【发布时间】:2018-11-21 18:48:08
【问题描述】:

我正在寻找一些数据结构来在 C++ 中存储多图,但我想尽可能地利用 STL。目前我正在使用类似于单独链接哈希表的东西:std::map<int,std::vector<int>>。地图的键是顶点,值是std::vector<int>,其中包含与键形成边的所有不同顶点。

我主要对 O(1) 查找感兴趣,以查看一个顶点是否与另一个顶点共享一条边。由于这是一个未加权的多重图,因此顶点可以与另一个顶点共享多条边。

该图保证有欧拉回路和哈密顿回路,但我不确定这是否相关。

对于使用 STL 比 std::map<int,std::vector<int>> 更好的数据结构,你们有什么建议吗?

【问题讨论】:

  • std::map 不提供O(1) 查找,它具有O(logN) 查找。您需要 std::unordered_map 进行 O(1) 查找。
  • 就绝对速度而言,您无法击败邻接矩阵。
  • @NathanOliver 谢谢!
  • @n.m.如何将邻接矩阵用于多重图?如果它不是多图,我会使用一个。
  • 我的第一个建议是寻找现有的图形库。记录,公开测试,可能已经优化。对于家庭项目,你说如果边是连接的,你主要想要快速查找,所以......你关心它是一个多重图吗?您可以忽略所有额外内容并使用 unordered_map。我提到这个选项是因为多个边缘对于“是否存在边缘”并不重要。

标签: c++ data-structures graph


【解决方案1】:

如果顶点数 N 很小,使用邻接矩阵unordered_map<int, unordered_map<int, int>> graph 可能最简单,其中graph[u][v] 是从uv 的边数。

如果您的顶点编号的范围都是从 0 到 N–1,或 1 到 N,或类似,您可以将其简化为 vector<vector<int>> graph,如果 N 在编译时已知,甚至可以简化为 int graph[][]

如果 N 很大,并且如果图是稀疏的,如您所指出的(因为 M ≈ N),最好为每个顶点使用一个集合:unordered_map<int, unordered_set<int>> graphvector<unordered_set<int>> graph,其中 graph[u] 是所有顶点v 的集合,边从uv

请注意,我正在使用 unordered_mapunordered_set 集合,它们平均提供 O(1) 访问权限。在最坏的情况下,它们的性能与映射或集合的大小成线性关系,就像任何基于哈希的容器一样。

如果您不想处理所有这些问题并想要一个现成的解决方案,请考虑使用 Boost Graph Library、NGraph、LEMON 或 Google OR-Tools。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2021-08-21
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多