查找作为特定集的子集的集合

时间:2009-12-26 09:35:29

标签: algorithm set information-retrieval

假设我有4个不同的值A,B,C,D和附加的标识符集。

A = {1,2,3,4,5}
B = {8,9,4}
C = {3,4,5}
D = {12,8}

给定标识符{1,30,3,4,5,12,8}的集合S,我希望它返回C和D.即从一组S中检索所有集合,其中S是超集。< / p>

是否有任何算法可以有效地执行此任务(最好是内存复杂度低。使用外部设备存储数据不是一种选择)? 一个简单的解决方案是超集S中的每个成员检索包含该成员的集合列表(基本上是倒排索引),并且对于每个返回的集合检查他的所有成员都在超集中。不幸的是,因为平均而言,超集将包括每个集合中至少一个成员,这种方法会对性能造成重大且不可接受的影响。

我试图用Java做到这一点。 Set由整数组成,它们识别的值是一个对象。 集合的集合不是静态的,并且在执行过程中必然会发生变化。但是设定数量会有一些限制。 套装尺寸不限。但平均而言,它在1到20之间。

3 个答案:

答案 0 :(得分:3)

  1. 浏览 S 中的每个元素 x
  2. 对于 x t 的每一组 t ,增加一个反调用 t count - 与 t 相关联。
  3. 毕竟,对于 t count = |的每一组 t t |,您知道 t S
  4. 应用。

    在第2步之后。

    count = 4,
    B count = 1,
    C count = 3,
    D count = 2。

    第3步处理。

    count ≠| A | (4≠5) - 拒绝,
    B count ≠| B | (1≠3) - 拒绝,
    C count = | C | (3 = 3) - 接受,
    D count = | D | (2 = 2) - 接受。

答案 1 :(得分:1)

请注意cgkanchi注意事项:以下算法假设您不使用集合而是使用数组。如果不是这种情况,你应该寻找一个实现集合交集的方法,然后问题是微不足道的。这是关于如何使用数组实现交集的概念。

  1. 使用heapsort对所有集进行排序,以进行就地排序O(1)空间。它在O(nlogn)中运行,很快就会收回你的费用。
  2. 对于所有集合中的每一组L

    2.1。 j = 0

    2.2。对于i中的L元素:

    2.2.1。从j元素L[i] S开始L[i] = S[j]拒绝L。如果S和{{1}}足够大则使用二分搜索或插值搜索(对于第二个,请查看您的数据分布)

    2.3。接受

答案 2 :(得分:0)

对于Java,我使用 Hashtable 作为 S 中元素的查找表。然后,对于 X 中的每个元素,要测试的集合是否是 S 的子集,请测试它是否在查找表中。如果 X 的所有元素也在 S 中,则 S X 的超集。