我们非常感谢帮助确定线性时间复杂度算法,用于构建有限元素集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}。
是否有一个线性算法用于从一组有限元素的子集中构建交叉图?
答案 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]