在我的应用程序中,我需要比较集合列表的各个部分,看它们是否包含相同的元素。我基本上有以下结构:
List 1 Index Set
1 (1,5)
2 (3,7)
3 ()
4 (1,9,15)
我有大约20个列表,每个列表中有超过千个集合。列表中的集可以为空,也可以包含多达数百个元素。
我需要为列表的不同间隔创建这些集合的并集。 因此,例如,我想比较前一个列表的间隔与下面的列表:
List 2 Index Set
1 (3,6,9)
2 (2)
3 (20)
将间隔列表1从2到4与区间列表2从1比较2进行比较应给出(3,9)
目前我使用蛮力方法只需运行两个列表,比较每组。有更有效的解决方案吗?
提前致谢
答案 0 :(得分:2)
一种方法可以是为每个这样的列表创建一个辅助列表,其中包含到目前为止出现的每个元素索引中的直方图。
在你的例子中:
List Index histogram
1 [1=1, 5=1]
2 [1=1, 3=1, 5=1, 7=1]
3 [1=1, 3=1, 5=1, 7=1]
4 [1=2, 3=1, 5=1, 7=1, 9=1, 15=1]
现在,给定两个索引i,j
- 您可以通过获取两个直方图来创建索引i,i + 1,...,j中的集合的并集:hist1=list[i-1], hist2=list[j]
,并返回所有元素x
都是hist1.get(x) < hist2.get(x)
,并且在没有实际迭代列表的情况下获取联合集。
例如,在上面的列表中,如果要查找索引2,3,4的联合列表:
hist1=list[1] = [1=1, 5=1]
hist2=list[4] = [1=2, 3=1, 5=1, 7=1, 9=1, 15=1]
hist2-hist1 = [1=2-1, 3=1-0, 5=1-1, 7=1-0, 9=1-0, 15=1-0] =
= [1=1, 3=1, 5=0, 7=1, 9=1, 15=1]
union_set = {1,3,7,9,15}
当集合比列表小得多时,这种方法特别有用,这似乎是你的情况。