【问题标题】:Efficient solution to add each of the element in the array with the other element将数组中的每个元素与另一个元素相加的有效解决方案
【发布时间】:2012-05-16 20:25:02
【问题描述】:

这看起来很琐碎,不是家庭作业问题。

public void sum(int[] arr){
  for(int i=0;i<arr.length;i++)
  {
    for(int j=0;j<arr.length;j++)
      System.out.println(arr[i]+"+"+arr[j]+"+"+"="+(arr[i]+arr[j]));
  }   
}//end of sum function

这将打印每个元素的所有总和。这是 O(n^2)。

我想知道这是否可以更有效地解决。

【问题讨论】:

  • 是一维数组吧!那么你需要 2 个 for 循环吗?
  • @Jameelopix OP 正在将数组中的每个元素添加到数组中的每个其他元素中。
  • 大部分时间都花在构建字符串和写入控制台上。对于 1000 多个条目,添加可能只是毫秒的一小部分。
  • 同意彼得的观点,但也无法绕过它......这是一个 O(n^2) 问题!注意 O(n^2)/2 是 O(n^2)

标签: java arrays matrix addition


【解决方案1】:

由于 A + B 等于 B + A,您可以只检查索引 i 中初始元素之后的元素:

public void sum(int[] arr){
  for(int i=0;i<arr.length;i++)
  {
    for(int j=i;j<arr.length;j++) //Note: j = i, not j = 0
      System.out.println(arr[i]+"+"+arr[j]+"+"+"="+(arr[i]+arr[j]));
  }   
}//end of sum function

还是O(n^2)/2,所以复杂度基本还是二次的。

【讨论】:

  • 对于这个问题不可能比二次方更好
  • 此外,使用 (a) 专用硬件 (FPGA) 或 (b) 并行处理可以显着加快工作速度
  • 这也是我的解决方案,但你的速度更快,所以我猜你得到了我的投票。但是为了获得相同的输出,他需要存储之前的结果,并在跳转到内部循环之前获取并打印所有数字 0 到 i 的结果。
  • 如果你在像 cuda 这样的 gpu 上有 n 个核心,你可以将任务减少 n 并在 1 遍中完成。
【解决方案2】:

如果您使用sparse matrices,您可以更快地添加矩阵。由于 0 + 0 = 0,稀疏矩阵允许您跳过对这些元素执行加法。

否则,正如其他人所说,您也可以很容易地将问题并行化。

【讨论】:

    【解决方案3】:

    您是否关心打印结果的顺序? 如果你不这样做,也许你可以拆分任务并查看并行减少。

    我没有测试过,但在这些行中有一些东西

    public void sum(int[] arr){
    for(int i=0;i<arr.length;i++)
    {
       for(int j=0;j<arr.length/2;j=+2)
       System.out.println(arr[i]+"+"+arr[j]+"+"+"="+(arr[i]+arr[j]));
       System.out.println(arr[i+1]+"+"+arr[j+1]+"+"+"="+(arr[i+1]+arr[j+1]));
    }   
    }//end of sum function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      相关资源
      最近更新 更多