不包含集合的集合集合,集合是集合中另一个集合的子集

时间:2009-11-15 09:25:39

标签: data-structures set subset

我正在寻找一个抽象的数据结构,它表示集合的集合,这样集合中的任何集合都不是集合中另一个集合的子集。

这意味着在插入时将满足以下条件:

一个。插入已经是另一个元素子集的元素将返回原始集合。

B中。插入作为任何其他元素的超集的元素将导致添加了超集并删除子集的集合。

假设对集合的元素进行排序,则可以使用前缀树来表示集合。这允许非常快速地处理条件A(即,不再检查条件而不是插入子集)但是满足条件B需要时间。

我想知道是否存在允许B快速满足的数据结构。

4 个答案:

答案 0 :(得分:3)

简单的方法是保留一个集合列表并对每个传入集合执行线性搜索(测试传入是否是子集)。

这显然在线性搜索的O(n)时间内运行,并且可能在输入集的大小上运行O(m)大小。因此O(n * m)总时间(组数与每组的大小)。

当然,最明显的优化是对集合大小进行索引。然后,您只测试每个传入集与那些相同或更大的传入集。 (集合不能是任何较小集合的子集,呃!)。

我想到的下一个优化是在元素索引中创建。因此,对于每个传入集,您将找到包含每个元素的每个集合的交集。换句话说,如果对于传入集合{a,b,c},我们发现元素{a}存在于集合A,B和D中,则元素{b}存在于B,E和F中,并且{c}存在于A,B和Z ...然后输入集是B的子集({A,B,D},{B,E,F}和{A,B,Z}的交集)。

所以,这听起来像是O(m * log(n))的复杂性。 (我们必须对每个传入集的每个元素执行散列搜索)。插入也应该在同一个顺序上(将新集的ID插入每个元素的映射中)。 (在Big-O分析中,2 * O(m log(n))减少到O(m log(n)),当然)。

答案 1 :(得分:0)

一个简单的想法,它将在O(K)中起作用,其中K是要添加的元素的大小。

  • 以任何你想要的方式保持集合
  • 保留set_id的地图 - > set_size
  • 保持对象的地图 - > SET_ID

A和B都是O(K)。

答案 2 :(得分:0)

如果您的集合A,B,...的各个成员被映射到不同(和相对)素数,并且在每个集合旁边,您将所有成员的产品存储为p(A),p(B)然后可以通过p(X)是p(Y)的因子来找到子集和超集,反之亦然。

我猜你可能会得到一些非常大的数字,但它在理论上是有效的。

例如:

如果[a b c d] - > [2 3 5 7],p(abc)= 30,p(abd)= 42,p(bc)= 15,p(abcd)= 210

答案 3 :(得分:0)

多么愚蠢的网站!我现在已经注册,所以可以在适当的时候对昨天的内容进行评论。然而,在那之前......

@Stephen C:虽然我认为我的英语足够了但我似乎已经获得了一个解释器:但他错过了一些内容,但他的评论应该如下:


  

@Stephen C:找到一个因素   任意数字确实是NP完整的,但这里不相关。该   问题是两者中的较小者   数字正好划分较大的,a   简单模数运算。例如,   p(bc)= 15是p(abcd)= 210的除数,   所以bc是abcd的子集(和abd一样   和abc)。

     

将新的集合S添加到现有的N个集合中是O(N),假设大数字的比较和除法大致相同,无论N是什么。

     

对于集合集合中的每个现有条目E,如果p(S)则停止   < p(E)和p(S)精确地划分p(E)。如果p(S)= p(E),则停止。如果p(S)>,则删除E. p(E)和p(E)精确地划分p(S)。如果到达集合的末尾,请添加S.数组   BigNums会起作用。


@JL:如果您想成为我的现场跟踪者,请尽力1)准确地增加价值。