这里有一种方法受到MapReduce:大型集群上简化的数据处理的启发,如果需要的话可以通过分布式方式实现。
将所有元素映射到一组对[元素,集合]
中。按元素分组此列表。您只需排序并提取元素即可。或者,您可以创建一个散列数组,其键是元素,值是找到该元素的集合列表。然后对于每个元素,发出一个[集合的组合,元素]
列表。按组合分组。对于每个非空组合,您现在可以轻松读取其中的元素。
如果您希望使用真正的map-reduce来分发计算,第一个映射将映射到元素键和集合值。第一个缩小仅存储所在集合的集合列表。第二个映射会发出每个元素的一个键,表示它所在的每个集合组合,并以该值作为元素。第二次缩小将存储最终答案。
详细说明您的示例可能有所帮助。您从以下内容开始:
Set 1 = 1, 10, 6, 11, 14, 3
Set 2 = 3, 7, 11, 9, 5
Set 3 = 11, 6, 9, 1, 4
您将其映射到列表中:
[1, Set 1], [10, Set 1], [6, Set 1], [11, Set 1], [14, Set 1], [3, Set 1],
[3, Set 2], [7, Set 2], [11, Set 2], [9, Set 2], [5, Set 2],
[11, Set 3], [6, Set 3], [9, Set 3], [1, Set 3], [4, Set 3],
现在按元素分组 (我手动排序实现) 得到:
1: Set 1, Set 3
3: Set 1, Set 2
4: Set 3
5: Set 2
6: Set 1, Set 3
7: Set 2
9: Set 2, Set 3
10: Set 1
11: Set 1, Set 2, Set 3
14: Set 1
现在我们进行第二次映射(跳过仅出现在一个集合中的元素),得到:
[(Set 1, Set 3), 1],
[(Set 1, Set 2), 3],
[(Set 1, Set 3), 6],
[(Set 2, Set 3), 9],
[(Set 1, Set 2), 11],
[(Set 1, Set 3), 11],
[(Set 2, Set 3), 11],
[(Set 1, Set 2, Set 3), 11]
通过集合的组合,我们得到:
(Set 1, Set 2): 3, 11
(Set 1, Set 3): 1, 6, 11
(Set 2, Set 3): 9, 11
(Set 1, Set 2, Set 3): 11