这是一个受启发的解决方案MapReduce:简化大型集群上的数据处理 http://research.google.com/archive/mapreduce.html,因此如果您愿意,可以以分布式方式编写。
将集合中的所有元素映射为对[element, set]
。按元素对该列表进行分组。您只需排序并提取元素即可。或者,您可以创建数组的哈希值,其键是元素,值是在其中找到该元素的集合列表。然后对于每个元素,发出一个列表[combination of sets, element]
。通过组合对其进行分组。现在,对于每个非空组合,您只需读取其中的元素即可。
如果你想用真实的分布计算映射减少,第一个映射将映射到元素的键和集合的值。第一个reduce只会按元素存储它所在的集合列表。第二个map将为每个元素发出它所在的每个集合组合的一个键,并以元素作为值。第二次减少将存储您的最终答案。
详细说明您的示例可能会有所帮助。你从以下开始:
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