3
A
回答
11
这是一个受http://research.google.com/archive/mapreduce.html启发的解决方案(因此,如果需要,可以采用分布式编写)。
将所有元素集合映射到对[element, set]
。按元素分组这个列表。 (您可以对元素进行排序和拉出,或者您可以创建一个数组的散列,其中的键是元素,值是该元素的列表。)然后,对于每个元素,发出一个[组合,元素]。通过组合来分组。现在对于每个非空组合,您可以读取其中的元素。
如果您希望使用真实的map-reduce分配计算,则第一个映射将映射到元素的键和set的值。第一个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
(这不同于你所建议的答案,因为你错过了11中的1套的交集和3)
1
使用你的榜样,只是注意
1 N 2 N 3
也
(1 N 2)N 3
所以如果你缓存你的(1 n 2)解决方案,你可以重新使用它,这样计算1 n 2 n 3只会需要一个额外的交点计算。一般来说,如果您的例子中有四种可能的组合,那么如果您保存并重新使用之前的结果,最终只需要完成四个交叉。
相关问题
- 1. 从n个组中查找所有组合的大小n
- 2. 将一个集合分为两个不相交的子集(所有组合)
- 3. N数组或集合?
- 4. 在PostgreSQL中查找所有组范围的所有交集
- 5. Php获取n维数组的所有组合
- 6. 如何生成数组中所有n个元素的组合?
- 7. 如何编写'n'字符串的所有组合?重复:C = n!/(n-k)!
- 8. 所有可能的'n'字符串组合,重复:C = n!/(n-k)!
- 9. 找到一组集合的所有逻辑组合
- 10. 计算集合/组的所有可能组合
- 11. 如何返回n对括号的所有有效组合?
- 12. 集合的交集
- 13. 检索集合中的所有N个孩子
- 14. n列表的交集
- 15. 得到的长度为N的所有组合M个
- 16. 返回所有可能的n个物体组合的算法
- 17. 在N组中找到N个项目的所有组合,而不用重复项目组合(python)?
- 18. 如何找到一组所有可能的n元素子集?
- 19. 获取N个阵列的所有组合
- 20. 函数返回n个布尔值的所有组合?
- 21. 查找n个k个元素的所有组合
- 22. 如何获得n个二进制值的所有组合?
- 23. 所有可能的组合组合
- 24. 前n个MongoDB的集合
- 25. 在所有集合
- 26. 如何枚举一个集合的所有k-组合?
- 27. vb.net对组合创建所有可能的集合
- 28. 在java中找到所有可能的组合集合
- 29. 从Smalltalk中的集合生成所有组合
- 30. 查找给定数字集合的所有组合
一对夫妇的进一步建议:(1)如果以递归方式生成它们,并且按照正确的顺序生成它们,则不需要显式缓存先前的解决方案,因为所需的任何解决方案都可以在调用堆栈中更高的位置使用; (2)如果单个列表可能非常长,但它们的交点往往不是,那么它可能是相交的*两个*已经相交的集合(例如,得到1 n 2 n 3 n 4,它可能更快计算1 n 2 n 3)n(2 n 3 n 4)比(1 n 2 n 3)n 4)。 – 2014-09-25 00:11:36