计算特定算法的大O复杂度
Calculate big O complexity of specific algorithm
我目前正在努力寻找以下源代码片段的大 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循环的复杂度是多少?
内循环是 O(i)。如果您考虑它执行的步骤,它将在第一个 运行 上执行 4 个,第二个执行 8 个,第三个执行 16 个……直到达到 n。如果您认为 n 是 2 的幂以使数学更容易一些,则 4 + 8 + 16 + ... + n/4 + n/2 + n ... 将 <= 2n。所以总而言之,你的算法是 O(n).
首先,请注意您有一个 built-in counter
,它将准确记录 运行 的迭代次数。你对那个因素的实验在哪里?当 n
增加到非常大的数字时,counter
会如何反应?简而言之,这就是复杂性的定义。
考虑您的 loop,而不仅仅是 header 语句。 整个循环控制是
i = 1
while i < n
...
i *= 2 // i = 4*i / 2
相当于
for (i = 1; i < n; i *= 2)
因此,您的内部循环确实是 O( log2(n) ).
在内循环中,从不使用x
;您可以完全放弃该计算。循环所做的只是计算迭代次数。
用n
的各种值调用例程;打印结果。
我目前正在努力寻找以下源代码片段的大 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循环的复杂度是多少?
内循环是 O(i)。如果您考虑它执行的步骤,它将在第一个 运行 上执行 4 个,第二个执行 8 个,第三个执行 16 个……直到达到 n。如果您认为 n 是 2 的幂以使数学更容易一些,则 4 + 8 + 16 + ... + n/4 + n/2 + n ... 将 <= 2n。所以总而言之,你的算法是 O(n).
首先,请注意您有一个 built-in counter
,它将准确记录 运行 的迭代次数。你对那个因素的实验在哪里?当 n
增加到非常大的数字时,counter
会如何反应?简而言之,这就是复杂性的定义。
考虑您的 loop,而不仅仅是 header 语句。 整个循环控制是
i = 1
while i < n
...
i *= 2 // i = 4*i / 2
相当于
for (i = 1; i < n; i *= 2)
因此,您的内部循环确实是 O( log2(n) ).
在内循环中,从不使用x
;您可以完全放弃该计算。循环所做的只是计算迭代次数。
用n
的各种值调用例程;打印结果。