[英]Finding Big O notation
我有以下代码,我想找到大 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)
首先:简单的总和和增量是 O(1),它们是在恒定时间内完成的,所以x[i] += 2;
是常数,因为数组索引也是 O(1),对于i++
等也是如此。
第二:一个函数的复杂度和它的输入大小有关,所以实际上这个函数的时间复杂度只是伪多项式
由于 n 是一个整数,循环需要大约 n/2 次交互,这与 n 的值呈线性关系,但与 n 的大小(4 字节或 log(n))无关。
所以这个算法实际上是 n大小的指数。
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(n) + O(n/2) = O(n)
就大 O 而言。
您必须注意依赖于 n 的嵌套循环,如果(正如我首先想到的,由于i
双重使用)您将拥有O(n) * O(n/2)
,即O(n^2)
。 在第一种情况下,它实际上是关于O(1,5n) + C
但是从来没有用来描述 Ordo。
使用 Big O,您将值推向无穷大,无论您拥有多大的 C,它最终都会过时,就像它是1.000.000n
或n
。 前缀最终会过时。
话虽如此, n
的修饰符和常量确实很重要,只是在 Ordo 上下文中没有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.