【发布时间】:2017-10-02 02:03:26
【问题描述】:
我对此代码的大 O 表示法有疑问:
int strange_sumA(int[] arr) {
if (arr.length == 1) {
return arr[0];
} else {
int newlen = arr.length/2;
int[] arrLeft = new int[newlen];
int[] arrRight = new int[newlen];
for (int i=0; i<newlen; i++) {
arrLeft[i] = arr[i];
}
for (int i=newlen; i<arr.length-1; i++) {
arrRight[i-newlen] = arr[i];
}
return strange_sumA(arrLeft) + strange_sumA(arrRight);
}
}
据我了解,第一个for循环是O(n/2),第二个for循环是O(n/2),使得整个第一次运行O(n)。然后,在第一次递归之后,接下来的两次递归的大 o 仍然是 O(n),因为 2[n/2] = n,下一个也是因为 4[n/4] = n。那么,这个算法的整个大 O 表示法会是 O(n^2) 吗?我认为代码会运行 N 次但我不确定
【问题讨论】:
-
警告:对于奇数长度的输入数组,这将无法正常工作。新的“半数组”总共将有 一个 元素,第二个
for循环将超出arrRight数组的边界 -
请记住 O(n / 2) 和 O(n) 的含义完全相同。说 O(n / 2) 在技术上并没有错,但它有点不寻常。