我正在阅读 Big O符号。它说,
循环的大O是循环的迭代次数 循环中的语句数量。
以下是代码段
for (int i=0 ;i<n; i++)
{
cout <<"Hello World"<<endl;
cout <<"Hello SO";
}
现在根据定义,Big O应该是 O(n * 2),但它是 O(n)。任何人都可以解释为什么会帮助我吗? 谢谢你。
答案 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)。