我正在尝试分析一个简单算法的Big- O -otation,并且我已经有一段时间了。所以我根据以下代码的规则进行了分析,并试图弄清楚这是否正确:
public int Add()
{
int total = 0; //Step 1
foreach(var item in list) //Step 2
{
if(item.value == 1) //Step 3
{
total += 1; //Step 4
}
}
return total;
}
如果您指定了变量或集合,在这种情况下,复杂性是根据Big O 的规则确定的是 O (1) 即可。所以第一阶段将是 O(1) - 这意味着无论输入大小是多少,程序都将执行相同的时间和内存空间。
< / LI>第二步是foreach
循环。循环中有一点很清楚。根据输入,循环迭代或运行。作为示例,对于输入10,循环迭代10次并且持续20次,20次。完全取决于输入。根据Big O 的规则,复杂性将是 O(n) - n 是输入数量。因此,在上面的代码中,循环根据列表中的项目数进行迭代。
在此步骤中,我们定义一个确定条件检查的变量(参见编码中的步骤3)。在这种情况下,根据Big O 规则,复杂性为 O(1) 。
以同样的方式,在步骤4中,也没有变化(参见编码中的步骤4)。如果条件检查为真,那么total
变量将值增加1.所以我们写 - 复杂 O(1) 。
因此,如果上述计算是完美的,那么最终的复杂性如下:
O(1) + O(n) + O(1) + O(1) or (O(1) + O(n) * O(1) + O(1))
我不确定这是否正确。但我想,如果这不是一个完美的话,我希望能对此有所澄清。感谢。
答案 0 :(得分:2)
用于描述函数的渐近行为的大O表示法。基本上,它告诉你函数增长或减少的速度
例如,在分析某些算法时,可能会发现完成大小为n的问题所需的时间(或步数)由
给出T(n)= 4 n ^ 2 - 2 n + 2
如果我们忽略常量(这是有道理的,因为那些取决于程序运行的特定硬件)和增长较慢的术语,我们可以说&#34; T(n)&#34;生长在n ^ 2和#34;并写:T(n)= O(n ^ 2)
对于形式定义,假设f(x)和g(x)是在实数的某个子集上定义的两个函数。我们写了
f(x)= O(g(x))
(或f(x)= O(g(x))对于x - >无穷大更精确)当且仅当存在常数N和C时
| F(X)| &lt; = C | g(x)|对于所有x> N
直观地说,这意味着f的增长速度不会比g
快如果a是某个实数,我们写
对于x-> a ,f(x)= O(g(x))
当且仅当存在常数d> 0和C这样
| F(X)| &lt; = C | g(x)|对于所有x与| x-a | &LT; d
因此,对于您的情况,它将是
O(n)为| f(x)| &GT; Ç| G(X)|
来自http://web.mit.edu/16.070/www/lecture/big_o.pdf
的参考资料int total = 0;
for (int i = n; i < n - 1; i++) { // --> n loop
for (int j = 0; j < n; j++) { // --> n loop
total = total + 1; // -- 1 time
}
}
}
Big O Notation给出一个假设,当值非常大时外循环将运行n次并且内循环运行n次
假设n - &gt; 100比总n ^ 2 10000次运行时间
答案 1 :(得分:1)
您的分析并不完全正确。
整个复杂度为O(1)+ O(n)+ O(n)+ O(n)= O(n)。
答案 2 :(得分:1)
步骤3和4的计算不正确,因为这两个步骤都在for循环中。
所以步骤2,3和4的复杂度将是O(n)*(O(1)+ O(1))= O(n) 当用步骤1进行球杆击球时,它将是O(1)+ O(n)= O(n)。