计算特定算法的O复杂度

时间:2019-03-20 15:39:44

标签: algorithm time-complexity big-o complexity-theory

我目前正在努力寻找以下源代码片段的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循环的复杂性是什么?

2 个答案:

答案 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的各种值调用例程;打印结果。