假设我有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之间。
答案 0 :(得分:3)
count = 4,
B count = 1,
C count = 3,
D count = 2。
count ≠| A | (4≠5) - 拒绝,
B count ≠| B | (1≠3) - 拒绝,
C count = | C | (3 = 3) - 接受,
D count = | D | (2 = 2) - 接受。
答案 1 :(得分:1)
请注意cgkanchi注意事项:以下算法假设您不使用集合而是使用数组。如果不是这种情况,你应该寻找一个实现集合交集的方法,然后问题是微不足道的。这是关于如何使用数组实现交集的概念。
对于所有集合中的每一组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 的超集。