什么是循环的大O?

时间:2011-08-06 15:15:43

标签: big-o

我正在阅读 Big O符号。它说,

  

循环的大O是循环的迭代次数   循环中的语句数量。

以下是代码段

for (int i=0 ;i<n; i++)
{
    cout <<"Hello World"<<endl;
    cout <<"Hello SO";
}

现在根据定义,Big O应该是 O(n * 2),但它是 O(n)。任何人都可以解释为什么会帮助我吗? 谢谢你。

6 个答案:

答案 0 :(得分:16)

如果检查O()表示法的定义,您将看到(乘数)常数无关紧要。

在循环中要完成的工作是而不是 2.有两个语句,对于每个语句,你必须做几个机器指令,可能是50,或78,或者其他,但这与渐近复杂度计算完全无关,因为它们都是常数。它不依赖n。这只是O(1)。

O(1) = O(2) = O(c) where c is a constant.
O(n) = O(3n) = O(cn)

答案 1 :(得分:6)

O(n)用于使循环再次成为一个数学函数(如n ^ 2,n ^ m,..)。

所以如果你有这样的循环

  for(int i = 0; i < n; i++) {
     // sumfin
  }

循环所采用的最佳描述数学函数是用O(n)计算的(其中n是0..infinity之间的数字)

如果你有这样的循环

     for(int i =0 ; i< n*2; i++) {

     }

意味着需要O(n * 2);数学函数= n * 2

    for(int i = 0; i < n; i++) {
         for(int j = 0; j < n; j++) {

         }
    }

此循环需要O(n ^ 2)时间; math funciton = n ^ n 通过这种方式,您可以计算出你的循环需要多长时间n 10或100或1000

这样你就可以为循环等构建图形。

答案 2 :(得分:3)

Big-O表示法按设计(按定义)忽略常数乘数,因此O(n)和O(2n)完全相同。我们通常写O(n)因为它更短且更熟悉,但O(2n)意味着相同。

答案 3 :(得分:3)

首先,不要把它称为“大O”。这是错误的和误导性的。您真正想要找到的是渐近将作为n的函数执行多少指令。考虑O(n)的正确方法不是作为一个函数,而是作为一组函数。更具体地说:

  

O(n)是所有函数f(x)的,使得存在一些常数M和一些数x_0,其中对于所有x&gt; x_0,f(x)&lt; M x。

换句话说,当n变得非常大时,在某些时候,函数的增长(例如,指令的数量)将由具有一些常系数的线性函数限制。

取决于您如何计算指令,循环可以执行不同数量的指令,但无论它最多只迭代n次。因此,指令数量为O(n)。如果它重复6n或.5n或100000000n次,或者即使它只执行恒定数量的指令也没关系!它仍然属于O(n)中的函数类。

为了进一步扩展,类O(n * 2)= O(0.1 * n)= O(n),并且类O(n)严格包含在类O(n ^ 2)中。结果,该循环也在O(2 * n)中(因为O(2 * n)= O(n)),并且包含在O(n ^ 2)中(但上限不紧)。 / p>

答案 4 :(得分:0)

O(n)表示循环时间复杂度随元素数量线性增加。

2 * n仍然是线性的,所以你说循环的顺序为O(n)。

但是,您发布的循环是O(n),因为循环中的指令需要恒定时间。常数的两倍仍然是常数。

答案 5 :(得分:0)

通常big O表示法表示函数中的主要操作数。

在这个对n个元素的过度运作。所以复杂性 O(n)

肯定不是 O(n ^ 2),因为二次方是这些算法的复杂性,比如冒泡排序,它将输入中的每个元素与所有其他元素进行比较。

记住,冒泡排序,为了确定插入元素的正确位置,将每个元素与列表中的其他元素进行比较(冒泡行为)。

最多,您可以声称您的算法具有复杂性 O(2n),因为它为输入中的每个元素打印了2个短语,但是在big O符号O中( n)是O(2n)。