Big O表示法运行时

时间:2010-03-18 08:04:19

标签: c big-o

我已经获得了一些代码来计算他们的大O运行时间,有人可以告诉我我是否在正确的轨道上吗?

//program1
 int i, count = 0, n = 20000;

for(i = 0; i < n * n; i++)
{
    count++;
}

那是O(n ^ 2)吗?

//number2
int i, inner_count = 0, n = 2000000000;

    for(i = 0; i < n; i++)
    {
        inner_count++;
    }

这是一个O(n)?

//number3
for(i = 0; i < n; i++)
{
    for(j = 0; j < n; j++)
    {
        count++;
    }
}

为O(n ^ 2)?

//number4
for(i = 0; i < n; i++)
{
    for(j = 0; j < i; j++)
    {
        for(k = 0; k < j; k++)
        {
            inner_count++;
        }
    }
}

那是O(n ^ 3)吗?

//number5
int i, j, inner_count = 0, n = 30000;

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

那是一个O(n ^ 3)?

//number6
int i, j, k, l, pseudo_inner_count = 0, n = 25;

for(i = 0; i < n; i++)
{
    for(j = 0; j < i*i; j++)
    {
        for(k = 0; k < i*j; k++)
        {
            pseudo_inner_count++;
            for(l = 0; l < 10; l++);
        }
    }
}

非常困惑这一个O(n ^ 3)??

//number7

int i, j, k, pseudo_inner_count = 0, n = 16;

for(i = n; i > 1; i /= 2)
{
    for(j = 0; j < n; j++)
    {
        pseudo_inner_count++;
        for(k = 0; k < 50000000; k++);
     }
}

O(N)? (随着他们越来越努力,我越来越迷茫)

//number8
int i, j, pseudo_inner_count = 0, n = 1073741824;

for(i = n; i > 1; i /= 2)
{
    pseudo_inner_count++;
    for(j = 0; j < 50000000; j++);
}

为O(n ^ 2)?

另外一个我没有看到,也完全不知道 {

    int i, wrong_count = 0, n = 200;

    for(i = 0; i < square(n); i++)
    {
        wrong_count++;
    }

    printf("%d %d\n", wrong_count, square(wrong_count));

    return 0;
}

int square(int m)
{
    int i, j = 0;

    for(i = 0; i < m * m; i++)
    {
        j++;
    }

    return j;
}

如果有人能澄清这些并帮助我更好地理解它们,我将非常感激。

3 个答案:

答案 0 :(得分:8)

  • number5是O(N ^ 2)
  • number6是O(N ^ 6)
  • number7是O(N * logN)
  • number8是O(logN)

其余的似乎是正确的。

尝试了解作为N的函数完成了多少操作,所有常量操作,例如

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

实际上是O(1)

答案 1 :(得分:3)

number5 = O(n ^ 2) - 第二个循环从1变为小于n的数字,包括n,因此它基本上是1..n或O(n)。

number6 = O(n ^ 6) - 第二个循环是n ^ 2,第三个循环是n ^ 3(n * n ^ 2)。第四个内循环是O(1)所以它不算数。

number7 = O(n log n) - 第一个循环是O(log2(n))(因为你继续将索引除以2),第二个循环是O(n)1..n,内部循环又是O(1),因为它不依赖于n。

number8 = O(log n) - 与上述原因相同。

其余的都很好。

答案 2 :(得分:1)

如果我的快速追踪是正确的,您对5,6,7和8的回答是不正确的 下面是8的痕迹

1: int i, j, pseudo_inner_count = 0, n = 1073741824;
2: 
3: for(i = n; i > 1; i /= 2)
4: {
5:     pseudo_inner_count++;
6:     for(j = 0; j < 50000000; j++);
7: }

所以,第5行是一个原语,因此O(1)与第3行中的检查和赋值相同。第6行看起来像是大的东西,但因为它总是50000000,所以它是一个常数O(1)的时间操作,也让我们考虑这个shell:

1: int i, j, pseudo_inner_count = 0, n = 1073741824;
2: 
3: for(i = n; i > 1; i /= 2)
4: {
5: }

我不是为了免费做一个人的作业,但我会完成这一个,减少i的方法是两个分区的意思,它将需要log_2操作达到1,给出运行时间O(log(n))