寻找大O符号

时间:2015-12-08 23:49:36

标签: big-o

我有以下代码,我想找到Big O.我将我的答案写成评论,并希望检查我对每个句子和最终结果的答案。

public static void findBigO(int [] x, int n)
{ 
    //1 time
    for (int i = 0; i < n; i += 2) //n time
        x[i] += 2; //n+1 time

    int i = 1; //1 time
    while (i <= n/2) // n time
    { 
        x[i] += x[i+1]; // n+1 time
        i++; //n+1 time
    }
} //0

//result: 1 + n + n+1 + n + n+1 + n+1  = O(n)

2 个答案:

答案 0 :(得分:0)

首先:简单求和和递增是O(1),它们是在恒定时间内进行的,因此x[i] += 2;是常量,因为数组索引也是O(1)i++也是如此等等。

第二:函数的复杂性与其输入大小有关,因此实际上该函数的时间复杂度仅为pseudo-polynomial

由于n是一个整数,因此循环需要大约n / 2个相互作用,这个相互作用在n的上是线性的,但在n的大小上不是线性的(4个字节或的log(n))。

因此,该算法实际上是n的大小的指数。

答案 1 :(得分:-1)

for (int i = 0; i < n; i += 2) // O(n)
    x[i] += 2;

int i = 1;
while (i <= n/2)               // O(n/2)
{ 
    x[i] += x[i+1];
    i++;
}
就大O而言,

O(n) + O(n/2) = O(n)

你必须注意依赖于n的嵌套循环,如果(正如我首先想到的那样,感谢i的双重使用),你会得到O(n) * O(n/2),{{1} }}。在第一种情况下,它实际上是关于O(n^2)然而,它从未用于描述Ordo。

使用Big O,您可以将值推向无穷大,无论您拥有多大的C,它最终都会过时,就像它是O(1,5n) + C1.000.000n一样。前缀最终将过时。

话虽如此,n的修饰符以及常量确实很重要,而不是在Ordo上下文中。