确定集合是否为集合中任何成员的子集

时间:2018-08-07 11:33:22

标签: algorithm performance

我有一个由集合组成的集合A,需要确定A中的每个集合是否等于A中任何其他集合的子集。

我的直觉如下:将i中的每个集合A进行排序,然后将其值与一些保留字符连接起来,并确定该复合键是否存在于哈希图中。如果不是,则将组合键添加到哈希图中。然后,对于i中成员的每种组合,还对这些值进行排序并将其连接到一个复合键中,并将该键插入到哈希图中。然后继续进行A中的下一个设置。

这种方法的麻烦之处在于空间需求非常大,因为我在A中有〜.25百万套设备,其中有些拥有很多成员。我想在主内存中完成上述操作,但无法在16GB的RAM中完成。

是否有一种方法可以更节省空间地完成这项任务?非常感谢其他人在这个问题上可以提供的任何见解。

1 个答案:

答案 0 :(得分:1)

根据您拥有多少个不同的元素,inverted index可能很有意义。

基本思想是,对于每个元素e,您将构建一个包含e的集合的集合ID的列表。然后,对于每个集合i,您将与i中所有元素的列表相交(例如,可以通过对集合ID进行排序来优化),以获得包含i的所有元素的所有集合。

示例:

set 1: A, C
set 2: B, C, E
set 3: A, C, E

倒排索引:

A -> 1, 3
B -> 2
C -> 1, 2, 3
E -> 2, 3

然后对于集合1,您需要查询A & C的倒排索引,并与删除集合1(作为自命中)的列表相交,得出1 and 3,您最终得到包含集合1的集合3 。继续进行其他设置。

Apache LuceneElastic Search之类的图书馆有效地支持了这一想法。在内存中可能还可以使用内存中的倒排索引。