【发布时间】:2016-07-06 19:58:19
【问题描述】:
我正在尝试测量以下算法的大 O 复杂度:
int sumSome(int[] arr){
int sum = 0;
for (int i=0; i<arr.length; i++) {
for (int j=1; j<arr.length; j = j*2) {
if (arr[i] > arr[j])
sum += arr[i];
}
}
return sum;
}
根据我的理解,
if (arr[i] > arr[j])
sum += arr[i];
具有 O(1) 的大 O,因为它是恒定的并且什么都没有发生,尽管我很难尝试辨别它的 Big-O 符号,但听起来它的 for 循环。我以为
for (int j=1; j<arr.length; j = j*2) {
if (arr[i] > arr[j])
sum += arr[i];
}
是一个线性函数 O(n),因为 j 可能为 1,但它在 O(2n) 处以线性方式上升,即 O(n)。那么整个算法不会是O(n ^ 2)吗?显然我在 MOOC 考试中没有正确回答问题。谢谢!
【问题讨论】:
-
我不知道你是怎么得到
2n的。如果有的话,那就是n/2(这对 Big-O 来说并不重要) -
当然,
n/2其实是给j = j+2的
标签: java algorithm time-complexity big-o asymptotic-complexity