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

Algorithm 确定集合是否是集合中任何成员的子集,algorithm,performance,Algorithm,Performance,我有一个集合a由集合组成,需要确定a中的每个集合是否等于或是a中任何其他集合的子集 我的直觉是按如下方式进行:取A中的每个集i,排序,然后将其值与一些保留字符连接起来,并确定hashmap中是否存在该组合键。如果不是,则将复合键添加到hashmap。然后,对于i中的每个成员组合,也对这些值进行排序并将其加入到复合键中,然后将该键插入hashmap。然后转到A中的下一组 这种方法的问题是空间需求很大,因为我在A中有大约.25万套,有些有很多成员。我想在主内存中实现上述功能,但在16GB内存中无法实

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

我的直觉是按如下方式进行:取
A
中的每个集
i
,排序,然后将其值与一些保留字符连接起来,并确定hashmap中是否存在该组合键。如果不是,则将复合键添加到hashmap。然后,对于
i
中的每个成员组合,也对这些值进行排序并将其加入到复合键中,然后将该键插入hashmap。然后转到
A
中的下一组

这种方法的问题是空间需求很大,因为我在
A
中有大约.25万套,有些有很多成员。我想在主内存中实现上述功能,但在16GB内存中无法实现


有没有更节省空间的方法来完成这项任务?我非常感谢其他人在这个问题上提供的任何见解。

根据您有多少不同的元素,一个可能是有意义的

基本思想是为每个元素
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和3的列表相交,最后得到包含集合1的集合3。继续进行其他设置


图书馆喜欢或有效地支持这一想法。内存中也可能有反向索引可以在RAM中实现这一点。

非常感谢这个想法——我将尝试在RAM中解决它,并将继续。。。