【问题标题】:C++ Adjacency List Representation of Graphs图的 C++ 邻接表表示
【发布时间】:2020-10-16 08:29:26
【问题描述】:

在C++中实现图的邻接表表示的有效方法是什么?

  1. 向量 *edges;
  2. 列出*边;
  3. 地图 *edges;
  4. map> 边;

在我看来,它应该是选项 3 或 4,但我找不到任何使用它的缺点... 有吗?

有人可以帮我吗,这将是实现邻接表和竞争性编程的最有效方式吗?

【问题讨论】:

  • 我建议vector> adj_list。例如 adj_list[1] 将表示与顶点 1 共享一条边的所有顶点。
  • @Aditya_U 选项 3 或 4 有什么问题,向量将花费 O(n) 时间来搜索顶点 u 和 v 之间是否存在边,但可以在非常短的时间内完成使用maps数据结构...如果我做edges[u],我会得到一个u所有相邻顶点的map,并且可以高效地执行操作...你对此有什么想说的吗?

标签: c++ graph adjacency-list coding-efficiency adjacency-list-model


【解决方案1】:

在C++中实现图的邻接表表示的有效方法是什么

许多典型的图问题适用于需要表示一次的给定静态图,然后在解决相关问题时可以重复使用给定的表示。在这种情况下,std::unordered_map<int, std::vector<int>> 是一个合适的结构;其中,无序映射中给定 keyvalue 表示给定顶点的(单向/双向)连接顶点。没有理由使用有序的std::map 而不是摊销的常数时间查找容器std::unordered_map

关联容器 std::unordered_mapstd::unordered_set 可以快速查找(您在此处需要),但如果它们需要经常变异(例如,对于动态图问题),可能会对性能产生影响。与往常一样,如果您要实现高性能计算程序,分析和测量运行时和内存以找到实际问题实现的瓶颈是关键。

【讨论】:

  • 我现在编辑的这个新的第四个选项怎么样?我将不再使用向量,而是再次使用 map 来减少搜索时间...
  • 如果我看到包括所有操作在内的性能,使用矢量而不是地图有什么优势?
【解决方案2】:

这是为了特别解决您的第四个选项。

您可以从 Sedgewick 和 Wayne 的 Algorithms, 4th Edition 中汲取灵感,并使用 array/vectorunordered_multisets(仅在未加权边的情况下的相邻节点)或 unordered_multimaps(相邻节点和在加权边缘的情况下边缘)。在那本书中,他们使用 Java 并使用 Bag 数据结构,这是一个无序的对象集合,可能存在重复。

“外部”数据结构的选择可以是unordered_map,也正如@dfrib 所建议的那样。正如他所说,需要衡量自己的应用才能决定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多