【问题标题】:Linear time complexity algorithm for building the intersection graph构建交集图的线性时间复杂度算法
【发布时间】:2016-08-23 01:00:53
【问题描述】:

在确定线性时间复杂度算法以构建有限元素 U 的一组子集的交集图时,我们将不胜感激。

例如,令 U = {a,b,c,d,e,f,g,h}。考虑 U 的集合 S = { {{a,b}, {c,d}, {a,e,h}, {e,f,g} }。我们需要以线性方式构建 S 的交集图 G时间,如果可能的话。 S 中的每个元素都是 G 的一个节点。当且仅当 N1 和 N2 至少有一个共同的元素时,G 中的两个节点 N1 和 N2 之间有一条边。

例如,上面 S 的交集图 G 将有四个节点,即 {a,b}、{c,d}、{a,e,h} 和 {e,f,g}。 G 将有 G 的 2 条边,即 {a,b}-{a,e,h} 和 {a,e,h}-{e,f,g}。

是否有一种线性算法可以从一组有限元素的子集构建交集图?

【问题讨论】:

  • 你的意思是输入的大小是线性的还是输出的大小是线性的?一般来说,输入的大小不可能是线性的,因为输出图的大小可能与输入的大小成二次方。
  • 边不应该包括 {a,e,h} 而不是 {a,e,i}?
  • 你能展示任何在这个算法上的工作吗?也许一个正确但太慢?事实上,你不是在寻求帮助,而是要求别人为你做这件事。
  • @templatetypedef 显然,没有算法可以比输出的大小更快。通常,“线性”的意思是“输入大小与输出大小成线性”。这是有道理的,因为读取输入/写入输出是算法的一部分(有时您实际上不必读取所有输入,但您总是必须写入输出)
  • @templatetypedef 感谢您的评论。

标签: algorithm data-structures set intersection


【解决方案1】:

我可以在O(E * M) 中做到这一点,其中E 是结果图中的边数,M 是具有公共元素的节点之间的公共元素的平均数量。

当然。首先,我将给 S 的元素一个任意顺序,并按该顺序的索引命名 S 的元素。我还给 U 的元素一个任意顺序,并按该顺序按其索引命名每个元素。

这完全是一种奇特的说法,“我现在可以说我想要 U 中的第四个元素和 S 中的第二个元素”,而且这样做是 O(1)。

我创建以下数据结构:

table: 1...|U| -> list of numbers in range 1...|S|

现在我遍历S中的所有元素N,对于这样的N,我遍历N中的所有u,然后查看table[u]中的节点列表,并添加一个图 N 和 table[u] 中所有节点之间的边。最后将当前的N添加到table[u]

伪代码:

for N1 in S:
  for u in N1:
    for N2 in table[u]:
      Create edge N1-N2
    add N1 to table[u]

【讨论】:

  • 嗨@rabensky,我喜欢你的解决方案,谢谢。不过,我很好奇,鉴于您的伪代码,M(公共元素的平均数量)如何在复杂性O(E * M) 中发挥作用。能否请您详细说明一下?
  • @jhonatanoliveira 对于每条边,该算法将尝试平均创建 M 次边。例如,如果N1={a,b,c}N2={a,b,d},那么这个算法将创建两次边N1-N2。因此(取决于边缘的存储方式)实现可能必须在创建边缘之前检查边缘是否已经存在。如果边存储在邻接矩阵中,则不需要检查(新边覆盖旧边)。但如果边存储在邻接表中,则需要检查重复项,时间复杂度相应增加。
  • @user3386109 在图的任何合理实现中,检查边 N1-N2 是否存在是 O(1)。所以时间复杂度不会因为需要检查而增加。正如你所说,它增加了,因为每条边平均添加了M 次。
猜你喜欢
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2013-12-31
相关资源
最近更新 更多