【问题标题】:Sum of all the elements of 3 different arrays3个不同数组的所有元素的总和
【发布时间】:2017-06-03 03:05:21
【问题描述】:

我想要优化算法来找到数组中每个元素的总和。

例如让 3 个数组:

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];

【问题讨论】:

  • 你尝试了什么?
  • 我不确定您要做什么。如果您正在尝试做我认为的事情,那是阶乘时间算法。编辑您的问题。
  • 这也不是二维数组。
  • @Makogan:提出的算法有多个输入大小。简单地说三次或阶乘时间是没有意义的,因为有 3 个数组,每个数组的大小都是任意的。复杂度是它们大小的乘积(可以通过嵌套for循环的方式来推断)

标签: arrays algorithm


【解决方案1】:

对于此示例,abc 分别有 4、2 和 2 个元素。如果您想在每个组合中添加它们,将有 4 * 2 * 2 = 16 术语要添加。在这些条件下,a 的每个元素将出现 4 次,因为它将被添加到 2 * 2 = 4 的元素组合 bc。同样,b(或c)的每个元素都会出现8次,因为它会被添加到ac(或b)的每个元素的每个4 * 2 = 8组合中。

因此,在最后的总和中,a 的每个元素将出现 4 次,bc 的每个元素将出现 8 次。一旦你弄清楚了,你可以做更少的乘法和加法来得到结果。(只需将各个数组的元素相加,然后将这些和分别乘以 4 、 8 和 8 )。

【讨论】:

  • 为了进一步优化,预先计算每个数组的总和,然后乘以其他两个数组大小的乘积。
【解决方案2】:

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 是元素总数或每个数组的平均元素数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多