用于构建交叉图的线性时间复杂度算法

时间:2016-08-23 01:00:53

标签: algorithm data-structures set intersection

我们非常感谢帮助确定线性时间复杂度算法,用于构建有限元素集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将有2个G边,即{a,b} - {a,e,h}和{a,e,h} - {e,f,g}。

是否有一个线性算法用于从一组有限元素的子集中构建交叉图?

1 个答案:

答案 0 :(得分:2)

我可以在O(E * M)中执行此操作,其中E是结果图中的边数,M是具有公共元素的节点之间的公共元素的平均数。

不确定。首先,我将给出S元素的任意顺序,并按其顺序将索引的元素命名为S.我还给U的元素赋予了一个任意的顺序,并按照它的顺序为每个元素命名。

这简直就是说#34;我现在可以说我想要U中的第4个元素和S"中的第2个元素,而它的O(1)就是这样做的。

我创建了以下数据结构:

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

现在我查看N中的所有元素S,对于此类N,我会查看u中的所有N,然后查看列表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]