【问题标题】:Efficient data structure for representing a graph用于表示图形的高效数据结构
【发布时间】:2019-06-18 13:32:39
【问题描述】:

我必须实现一个有向图(有向图),它允许有多个弧(多图),就像链接的图像中一样。必须优化该图以处理大量节点,但其中两个节点之间有一些边。该图必须经常更新,并且必须支持有效的路径搜索。哪个是在使用的空间和查询时间之间折衷的有效数据结构?语言是标准 C(仅限 libc)。

graph example

【问题讨论】:

  • “经常更新”是什么意思?边缘发生变化或节点发生变化,例如添加或删除节点?
  • 什么是“路径搜索”?
  • 表示可以添加节点,也可以添加边。边缘可以删除或添加
  • 路径搜索,因为我必须搜索对特定感兴趣节点喜欢的节点

标签: c data-structures graph


【解决方案1】:

假设您有NODE_COUNT 节点。您创建一个长度为NODE_COUNT 的向量GRAPH。在条目X 上,您有一个可变大小的数组(动态分配)。每个条目看起来像GRAPH[X]=[A1, A2, A3] 来表示边缘{ (X,A1), (X,A2), (X,A3) }

如果您需要搜索某些边,在条目GRAPH[X] 上使用二叉搜索树也很方便。如果每个节点有超过 6 条边,您也可以考虑这种可能性,而不是在位置 GRAPH[X] 上使用无序数组。

因为该图有很多节点和很少的边,所以不应该使用矩阵。

如果您有数百万或数十亿个节点,问题就不同了,您应该考虑使用BDDs。这是另一个话题,我在这个帖子中不做详细介绍。其思想是,可以将图表示为表示该图的集合的特征函数。

【讨论】:

  • 你的答案应该提到这个数据结构的名称:它是一个邻接列表。它确实是 OP 要求的频繁更新的稀疏图的良好表示。
  • @KonradRudolph 是的,GRAPH[X] 可以是邻接列表,也可以是二叉搜索树,如果他需要进行更快的查找,或者他可以使用有序数组进行边的对数时间搜索-- 他可以根据每个节点的平均边数以及他需要在图上执行的操作类型来选择其中之一。
  • @KonradRudolph ... 或者,他可以选择任何东西来表示一个集合——例如,哥德尔数或中国剩余定理可以表示集合(尽管它们只有在节点的索引不是大),math.stackexchange.com/questions/113142/…
【解决方案2】:

您可以使用邻接矩阵。它本质上是一个显示邻接列表的二维数组。

这是一个例子。我相信它们相当快,需要 Θ(1) 时间来确定图中是否存在边。

如果“频繁更新”指的是更新边,这会很好,因为更新其中一个值需要恒定的时间。 (即添加 edge(3, 2) 将花费恒定时间,因为您只需在矩阵中增加 3,2 处的值)

对于确定最短路径,Dijkstra 算法是您最好的选择。

【讨论】:

  • @PaulOgilvie 取决于 OP 对“频繁更新”的含义。如果他的意思是频繁添加和删除节点,那么不会。如果他的意思是频繁添加删除边,那么是的
  • 请注意,这可能会引发问题“如何在 C 中实现邻接矩阵?”。如果您建议使用 2d 数组,那么与“很多节点但有一些边”相比,它是一个非常稀疏的数组,并且“有效的路径搜索”可能会很棘手。
  • 邻接矩阵不满足“多弧”要求
  • @Gpsy 现在我明白了——假设这些是标签,你可能是对的,我从来没有花时间真正阅读过这些数字,仔细一看似乎是标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多