我有以下代码,我想找到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)
答案 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) + C
或1.000.000n
一样。前缀最终将过时。
话虽如此,n
的修饰符以及常量确实很重要,而不是在Ordo上下文中。