【问题标题】:Most efficient way to sum up an array of integers对整数数组求和的最有效方法
【发布时间】:2015-09-19 20:48:08
【问题描述】:

我正在尝试找到一个子O(n)的方法来计算整数数组的总和~~~(而不是遍历0 - n,我是在n/2中做的)~~~ 我还在 O(n) 中做这件事

public static int sum(int[] s) {
    int length = s.length - 1;
    int half = length/2;
    int sum = 0;
    for(int i = 0; i <= half; i++) {
        System.out.println(i + " " + s[i] + " + " + s[length - i]);
        sum += s[i] + s[length - i];
    }
    return sum;
}

我的算法适用于偶数个整数,但是,当有奇数个整数时,它会将中间索引求和两次:

测试:

    int[] arr = {1, 2, 3, 4, 5};
    System.out.println(sum(arr));

输出:

0 1 + 5
1 2 + 4
2 3 + 3
Sum: 18

我的问题是 - 总结奇数的中间索引的最佳方法是什么?

【问题讨论】:

  • 这仍然是O(n),你知道的。您有相同数量的添加。您只是避免增加 i n 次,但现在您正在做减法。
  • O(n) 等于 O(n/2)
  • 如果您的数组值遵循趋势,例如索引,它可以小于 O(n),否则,最低将是 O(n)。
  • 现实生活中的效率与大O的关系并不密切。常数因素很重要。那么你在这里想要什么,理论时间复杂度(显然不能比 O(n) 做得更好)还是现实生活中的效率?
  • 非常感谢 - 这种方式在正确实施时实际上比遍历每个索引要慢。我现在觉得自己很傻=)

标签: java arrays algorithm


【解决方案1】:

即使您在一天结束时从 0 变为 n/2,这仍然是 O(n),您至少要触摸数组的每个元素一次。要对一个整数数组求和,至少需要 O(n) 时间,因为您必须触摸数组中的每个元素一次才能将其包含在总和中。

【讨论】:

  • 废话。我不知道.. 哎呀。因此,与遍历每个元素并求和它们相比,这样做没有任何好处?
  • 不,实际上你自己把事情复杂化了 :)
  • 哈哈.. 我正在将字符串反转技术(在其中交换 ilength - i 索引)来解决这个问题。我想我真的想多了。
  • @theGreenCabbage 不。实际上,正确实现您的方法比简单地遍历所有索引并求和元素要慢。
  • @FernandoMatsumoto 我同意,因为我需要一个条件来确定它是奇数还是偶数
【解决方案2】:

您的解决方案是 O(n),而不是 sub-O(n)。只需在循环内添加两个数字就不会改变它。没有办法使它低于 O(n),因为您需要遍历所有数字。

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 2022-01-18
    • 2014-01-31
    相关资源
    最近更新 更多