繁体   English   中英

寻找大 O 符号

[英]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.000nn 前缀最终会过时。

话虽如此, n的修饰符和常量确实很重要,只是在 Ordo 上下文中没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM