【问题标题】:Datastructure for undirected graph edges with constant time complexity具有恒定时间复杂度的无向图边的数据结构
【发布时间】:2014-01-01 13:50:51
【问题描述】:

我有一个无向图,其中节点存储在一个平面数组中。现在我正在寻找边缘的数据结构。获取给定节点的所有边应该具有恒定的时间复杂度。一条边包含两个节点索引和权重等附加信息。

我看到的唯一方法是复制数据,一个按左节点排序,另一个按右节点排序。

vector<vector<int>> left, right;

但我想防止重复边缘。

【问题讨论】:

  • 你所说的“得到”是什么意思。对于给定的节点(Vnodes),输出边的集合通常是 O(V)。你想在 O(1) 时间内得到所有这些吗?
  • @RichardPlunkett 它应该与图的大小无关,但当然可以取决于边的数量。请注意,我将问题编辑为仅询问无向图。
  • @Jarod42 这种区别不存在,因为图是无向的。

标签: c++ performance data-structures graph


【解决方案1】:

听起来你只是想要一个adjacency list 表示。

在此表示中,每个节点将存储其所有连接边的列表。

对于无向图,您可以让每个端点都存储边。

实际上没有一种方法可以在不重复的情况下在恒定时间内获取节点的连接边。但是您可以只将指针、引用或唯一 ID(例如,可以是边缘数组中的索引)存储到实际边缘,从而避免实际需要有 2 个它的副本浮动。

【讨论】:

  • 谢谢。顺便说一句,我如何在具有空内部向量的向量向量上执行 push_back()? edges.push_back(*(new Vector&lt;int&gt;())) 正确吗?
  • 只是edges.push_back(vector&lt;int&gt;())。如果使用new,就会出现内存泄漏,因为new 不能有对应的delete
【解决方案2】:

制作一个向量的向量。

每个节点都有一个包含所有节点的向量。

您应该在图表创建期间构建它。

【讨论】:

  • 好吧,这就是我的想法。但是,我必须为此复制我的节点,对吧?因为用一个向量的向量只能得到一个节点的所有边,该节点存储在左边。
  • 那里也有节点,所以不需要另一个向量。
  • 我有,但我无法在恒定时间内获取它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多