如果我们有两个数组A=[1,2,3,4]
和B=[1,2,3]
,我们需要找到总和1*1+1*2+1*3+2*1+2*2+2*3+3*1+3*2+3*3+4*1+4*2+4*3
,即两个数组中可能具有不同长度的所有可能对的乘积之和。
当然我们可以在O(n^2)
中完成,但有没有有效的方法呢?
谢谢。
此外,两个数组的整数分别为1..m
和1..n
答案 0 :(得分:7)
这可以在O(n+m)
时间内通过征收乘法的分配属性而不是加法来完成。
所需的金额可以概括如下:
(A[0]*B[0] + A[1]*B[0] + ... + A[m-1]*B[0]) + (A[0]*B[1] + A[1]*B[1] + ... + A[m-1]*B[1]) + ... + (A[0]*B[n-1] + A[1]*B[n-1] + ... + A[m-1]*B[n-1])
请注意,在每个部分总和中,我们可以将B
的元素分解出来。然后该系列简化为
(A[0] + A[1] + ... + A[m-1]) * B[0] + (A[0] + A[1] + ... + A[m-1]) * B[1] + ... + (A[0] + A[1] + ... + A[m-1]) * B[n-1]
请注意,A
中所有元素的总和是上述系列中每个术语的一个因子,可以将其分解为
(A[0] + A[1] + ... + A[m-1]) * (B[0] + B[1] + ... + B[n-1])
因此,我们可以计算两个数组的元素之和,并将它们相乘以获得系列的总和。
答案 1 :(得分:5)
1*1+1*2+1*3+2*1+2*2+2*3+3*1+3*2+3*3+4*1+4*2+4*3
=60
(1+2+3) * (1+2+3+4)
=60
为什么?
sum(B) + 2*sum(B) + 3*sum(B) + 4*sum(B)
sum(B) * sum(A)
答案 2 :(得分:1)
我们可以观察到以下事实:
A = [1,2,3,4];
B = [1,2,3];
A * B =
A[0] * B[0] + A[0] * B[1] + A[0] * B[2]+ .. +
A[3] * B[0] + A[3] * B[1] + A[3] * B[2] =
A[0] * (B[0]+B[1]+B[2]) + .. +
A[3] * (B[0]+B[1]+B[2]) = (A[0] + A[1] + A[2] + A[3]) * (B[0] + B[1] + B[2])
答案 3 :(得分:0)
正如其他人所说,你可以将你的公式重写为你的向量总和的乘积。
我不确定您的数组是否在范围1 ... n或确切范围内保持任意值。
如果他们持有范围1 ... n中的所有元素,您可以将sum of 1...n
重写为n*(n+1) / 2