算法的大O复杂度

时间:2016-08-25 03:07:32

标签: big-o computer-science

我试图找出算法的确切大O值。我将提供一个例子:

for (int i = 0; i < n; i++) // 2N + 2
{
    for (int x = i; x < n; x++) // N * 2N + 2 ?
    {
        sum += i; // N
    }
} // Extra N?

因此,如果我打破其中一些,int i = 0将是O(1),i&lt; n是N + 1,i ++是N,将内循环乘以N:

2N + 2 + N(1 + N + 1 + N)= 2N ^ 2 + 2N + 2N + 2 = 2N ^ 2 + 4N + 2

为循环终止和和常量添加N,= 3N ^ 2 + 5N + 2 ......

基本上,我并非100%确定如何计算算法的精确 O表示法,我猜是O(3N ^ 2 + 5N + 2)。

2 个答案:

答案 0 :(得分:1)

你的意思是什么?大O是渐近上界,因此根据定义它并不精确。

i=0视为O(1)而将i<n视为O(N + 1)是不正确的。相反,将外循环视为执行n次,并且对于外循环的每次迭代,内循环最多执行n次。循环内的计算需要恒定的时间(随着n变大,计算不会变得越来越复杂)。所以最终得到O(n * n * 1)= O(n ^ 2),二次复杂度。

当询问&#34; exact&#34;时,你正在运行内循环,从0到n,然后从1到n,然后从2到n,......,从(n-1) )到n,每次做一次恒定的操作。所以你进行n + (n-1) + (n-2) + ... + 1 = n*(n+1)/2 = n^2/2 + n/2次迭代。要从精确的计算数量到大O表示法,省略常量和低阶项,你最终得到O(n ^ 2)(1/2+n/2是中省略)。

答案 1 :(得分:-2)

Big O意味着最糟糕的案例复杂性。

在这种情况下,只有当两个循环都运行n个时间,即n * n时,才会出现最坏的情况。

因此,复杂性 O(n2)