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