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中解决它,并将继续。。。