我目前正在努力寻找以下源代码片段的O复杂性:
private static long algo1(long n){
long counter = 0;
long i = 1;
long x = 1;
while(i < n){
long a = 4*i;
for (long j = a; j >= 1; j--) {
x = x+j;
counter++;
}
i = a/2;
}
return counter;
}
在我看来,外部while(i < n)
的复杂度为log(n)。但是内部for循环的复杂性是什么?
答案 0 :(得分:0)
内循环为O(i)。如果考虑它执行的步骤,它将在第一次运行时执行4,在第二次运行时执行8,在第三次运行时执行16,直到达到n。如果您认为n是2的幂以简化数学,则4 + 8 + 16 + ... + n / 4 + n / 2 + n ...将小于等于2n。所以总而言之,您的算法是O(n)。
答案 1 :(得分:0)
首先,请注意,您有一个内置的counter
,它将准确记录运行的迭代次数。您在那个因素上的实验在哪里? counter
随着n
增加到非常大的数量时会如何反应?简而言之,就是复杂性的定义。
考虑您的循环,而不仅仅是标题语句。 整个循环控件是
i = 1
while i < n
...
i *= 2 // i = 4*i / 2
等效为
for (i = 1; i < n; i *= 2)
因此,您的内部循环确实是 O(log2(n))。
在内部循环中,从不使用x
;您可以完全放弃该计算。循环所要做的只是计算迭代次数。
使用n
的各种值调用例程;打印结果。