【问题标题】:Connecting Two Random Nodes in a Directed Acyclic Weighted Graph在有向无环加权图中连接两个随机节点
【发布时间】:2019-07-03 09:37:51
【问题描述】:

总结

所以我有一个有向无环加权图,其中每条边都有一个输入和输出节点,每个节点都有一个 ID,我使用字典将所有传入边按其 ID 映射到一个节点,另一个对所有节点执行相同操作传出边,因此当呈现节点 ID 时,我可以在 ~O(1) 时间内告诉所有传入和传出边。

要求

我需要能够添加新的随机边(即连接两个随机节点),以确保无论图形有多大,它都不会有任何循环。

我尝试了什么

由于我完全控制了如何构建我的图,我可以对其进行拓扑排序并使用卡恩算法来确定对于两个均匀随机选择的节点 N1 和 N2,该图是否会在 O(n) 时间内产生一个循环.问题是如果它发生了怎么办?我必须尝试一个新的随机配对并重复这个过程,直到我幸运为止。这听起来好像它与图的缩放比例真的很差,因为图的边越密集,新的随机图就越有可能创建一个循环。

我也看过这篇文章: Generating a random DAG ,这在本质上与我的问题相似,但是,由于其他限制,我不能使用建议的解决方案来根据节点的 ID 连接节点,而只能连接较小的 ID(之前带有新节点的节点)我有这个问题。

问题

有没有办法设计一个结构,只允许我在节点之间随机选择,如果通过新边连接,任何一个都不会产生与内存开销无关的循环?这应该是一个 O(1) 操作。

【问题讨论】:

  • 应该所有有效边都具有相同的添加概率吗?如果没有,您可以先选择一个节点,然后从一组可用的有效节点中选择另一个节点。但这并不是随机的。
  • 所有有效边需要有相同的被添加概率。通过考虑图 G 及其补码 G'(即所有未连接的内容),我设法更容易地对其进行可视化,然后进一步删除所有边作为可能产生的循环,如果添加的话。

标签: algorithm data-structures directed-acyclic-graphs weighted-graph


【解决方案1】:

我有一个 O(1) 解决方案来检查一条边是否可以包含在图中。但是,在最坏的情况下,插入边缘需要 O(n)

您可以维护一个二进制可达性矩阵R,其中R[u, v]=1,如果您可以从当前图表中的u 到达v,如果不是,则为R[u, v]=0R 最初可以使用 Floyd-Warshall 计算一次。

如果您想检查是否可以包含边(u,v),您现在只需检查是否R[v, u] = 0。如果是R[v, u] = 1,则您正在通过插入(u,v) 构建一个圆。

剩下的问题变成了更新这个结构。如果您最终将边 (u, v) 插入到图中,您将设置 R[u, v] = 1。此外,能够到达u (R[:,u]=1) 的所有节点现在都能够到达v (R[v,:] = 1) 可到达的所有节点。因此,如果R[i,u] = 1R[v:j] = 1,则需要设置您的条目R[i, j] = 1

不幸的是,在最坏的情况下,更新步骤将花费 O(n)。在实践中,当图形仍然相当稀疏时,您应该能够使用稀疏矩阵表示(带有索引的哈希列表 v 每行 u 其中R[u, v] = 1)有效地实现这一点,并且速度要快得多。

如果你想随机选择一条可能的边,你将不得不通过相同的结构额外维护和更新一个可能的边列表。

【讨论】:

  • 由于问题的性质,我会稍等片刻,看看是否出现其他解决方案,然后再接受。我曾经尝试过的所有方法都产生了与您的方法相似(尽管稍差)的结果。也许没有办法使用一些数据结构或数据映射在 O(1) 中完成整个事情?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 2021-09-26
  • 2012-12-18
相关资源
最近更新 更多