Java 给定一个数字数组,使用Map Reduce返回所有其他数字的乘积数组

Java 给定一个数字数组,使用Map Reduce返回所有其他数字的乘积数组,java,arrays,algorithm,mapreduce,complexity-theory,Java,Arrays,Algorithm,Mapreduce,Complexity Theory,最近在采访中被问到: 解决以下问题,然后通过Map Reduce 有一个由N个数字组成的数组A[N]。您必须组合一个数组输出[N],这样输出[i]将等于A[N]中除A[i]之外的所有元素的乘积。 例如,输出[0]将是[1]到[N-1]的乘法,输出[1]将是[0]和从[2]到[N-1]的乘法。 不使用除法运算符,在O(n)中求解 我能够正常地解决它,但不确定如何使用MapReduce完成 正常解决方案:正如amit在评论中所指出的,如果我们仅限于一个MapReduce,那么,在一些合理的假设下,我

最近在采访中被问到: 解决以下问题,然后通过Map Reduce

有一个由N个数字组成的数组A[N]。您必须组合一个数组输出[N],这样输出[i]将等于A[N]中除A[i]之外的所有元素的乘积。 例如,输出[0]将是[1]到[N-1]的乘法,输出[1]将是[0]和从[2]到[N-1]的乘法。 不使用除法运算符,在O(n)中求解

我能够正常地解决它,但不确定如何使用MapReduce完成


正常解决方案:

正如amit在评论中所指出的,如果我们仅限于一个MapReduce,那么,在一些合理的假设下,我们能做的最好的事情就是通过将数组
A
作为键值对来模拟二次算法

0: (n, A[0]), 1: (n, A[1]), ..., n-1: (n, A[n-1]),
像这样映射它

i: (n, A[i]) ->
  [(  0: A[i]), ..., (i-1: A[i]),
   (i+1: A[i]), ..., (n-1: A[i])],
然后减少

i: [A[0], ..., A[i-1], A[i+1], ... A[n-1]] ->
  i: A[0] ... A[i-1] A[i+1] ... A[n-1].

使用
lg n
MapReduces,我们可以进行更高效的并行计算。

由于计算模型中的整数大小通常由一个常数因子限定,该常数因子与保持
n
所需的常数因子不同,因此,in可能不完全可能(独立于除法的排除).如果没有一些假设,我认为这在O(n)中是做不到的。假设有
n
映射器和
n
还原器,每个映射器都得到一个元素。需要来自每个映射器的信息的还原器的数量是
n-1
——因此您被限制为O(n^2)个通信消息。