用于比较包含集合的部分的有效算法

时间:2015-05-12 07:25:18

标签: algorithm data-structures

在我的应用程序中,我需要比较集合列表的各个部分,看它们是否包含相同的元素。我基本上有以下结构:

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)

目前我使用蛮力方法只需运行两个列表,比较每组。有更有效的解决方案吗?

提前致谢

1 个答案:

答案 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}

当集合比列表小得多时,这种方法特别有用,这似乎是你的情况。