3个不同数组的所有元素的总和

时间:2017-06-03 03:05:21

标签: arrays algorithm

我希望并优化算法以找到数组中每个元素的总和。

例如let 3 array:

a = [1,2,3,4];
b = [5,6];
c = [8,9];

然后最终总和将等于:

sum(1,5,8)+sum(1,5,9)+sum(1,6,8)+sum(1,6,9)+sum(2,5,8)...+sum(4,6,9)

我尝试过,但我使用的算法有时间复杂度O(n ^ 3),所以我想要的东西比这个复杂度低。

这是我的算法:

sum = 0    
for(i=0;i<a.size();i++)
       for(j=0;j<b.size();j++)
          for(k=0;k<c.size();k++)
              sum = sum+a[i]+b[j]+c[k];

2 个答案:

答案 0 :(得分:3)

对于此示例,abc分别有4个,2个和2个元素。如果您想在每个组合中添加它们,则会添加4 * 2 * 2 = 16个术语。在这些术语中,a的每个元素都会出现4次,因为它会添加到2 * 2 = 4b元素的c组合中。同样,b(或c)的每个元素都会显示8次,因为它会添加到4 * 2 = 8和{{1}的每个元素的每个a组合中}(或c)。

因此,在最后的总和中,b的每个元素将出现4次,ab的每个元素将出现8次。一旦你想出来,你可以做更少的乘法和加法来得到结果。(只是各个数组的元素之和,然后分别乘以4,8和8)。

答案 1 :(得分:0)

a的每个元素都会以b的每个元素和c的每个元素的总和出现。

这意味着a中的每个元素都会以等于b.length * c.length的多个总和出现。

这也很容易从蛮力伪代码中看到:(为了便于阅读而修改)

for i = 0 to a.length
   for j = 0 to b.length     // happens once for each i
      for k = 0 to c.length  // happens b.length times for each i
         sum += a[i] + ...   // happens b.length * c.length times for each i

概括了这一点,我们提出了以下算法:

  • 汇总所有元素a,将结果乘以b.length * c.length
  • 汇总所有元素b,将结果乘以a.length * b.length
  • 汇总所有元素c,将结果乘以a.length * b.length
  • 返回上面添加的三个值。

这是O(n)算法,其中n是每个数组的元素总数或平均元素数。