我有一个由集合组成的集合A
,需要确定A中的每个集合是否等于A
中任何其他集合的子集。
我的直觉如下:将i
中的每个集合A
进行排序,然后将其值与一些保留字符连接起来,并确定该复合键是否存在于哈希图中。如果不是,则将组合键添加到哈希图中。然后,对于i
中成员的每种组合,还对这些值进行排序并将其连接到一个复合键中,并将该键插入到哈希图中。然后继续进行A
中的下一个设置。
这种方法的麻烦之处在于空间需求非常大,因为我在A
中有〜.25百万套设备,其中有些拥有很多成员。我想在主内存中完成上述操作,但无法在16GB的RAM中完成。
是否有一种方法可以更节省空间地完成这项任务?非常感谢其他人在这个问题上可以提供的任何见解。
答案 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 Lucene或Elastic Search之类的图书馆有效地支持了这一想法。在内存中可能还可以使用内存中的倒排索引。