最糟糕的案例大O与Java算法

时间:2016-02-04 04:08:38

标签: java algorithm big-o

1

for(i = 0; i < 3; i++){
    for(j = 0; j < 10; j++){
        print i+j;
    }
}

我认为大O将是30,因为大多数时间是3 * 10.

2

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

O是n * m?

3

for(i = 0; i < n; i++){
    for(j = 0; j < m; j++){
        for(int k = 1; k < 1000; k *= 2){
            print i+j+k;
        }
    }
}

n * m * log base 2(1000)Big O处于nlog(n)时间

4

for(i = 0; i < n - 10; i++){
    for(j = 0; j < m/2; j++){
        print i+j;
    }
}

5

for(i = 0; i < n; i++){
   print i;
}
//n and m are some integers
for(j = 1; j < m; j *= 2){
   print j;
}

如果你认识Big O,有人可以帮我一把。我正在看着这些而且不知所措。我希望我在正确的位置张贴这个,我发现这些问题很难。我感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

我认为重要的只是指出Big O符号是关于函数的,给定任意常量,在某些时候将被视为上界。

  1.   

    O(1)

    这是因为每个循环在恒定时间内迭代。我们将其称为O(1)而不是O(30),因为作为上限的函数是1,具有任意常数&gt; = 30。

  2.   

    O(n * m个)

    只是因为我们必须循环m次迭代n次。

  3.   

    O(n * m个)

    这与前一个相同,只是我们在中间抛出另一个循环。现在您可以注意到,这个循环与第一个问题类似,只是一个恒定的时间。因此,你甚至不需要花时间弄清楚它循环的频率,因为它总是不变的 - 它是O(1)并且会被解释为O(n * m * 1)我们可以简单地叫O(n * m)

  4.   

    O(n * m个)

    对于外循环,不要陷入.. - 10并意识到我们可以说循环在O(n)中运行。我们可以忽略.. - 10,因为我们忽略了第一个问题中的确切值; 常数并不重要。同样的原则适用于m/2,因为您可以认为m只是被1/2的常量操纵。所以我们可以称之为O(n * m)。

  5.   

    T(n)= O(n)+ O(lg m)=&gt; O(n + lg m)

    所以我们必须在这里看到两个组件;第一个循环和第二个循环。第一个循环显然是O(n),因此没有问题。现在第二个循环有点棘手。基本上,您可以注意到迭代器j呈指数增长(特别是2的幂),因此该循环将以指数方式(对数)运行。所以这个函数在O(n + lg m)中运行。

答案 1 :(得分:1)

任何常数因子都可以忽略。 O(30)等于O(1),这是人们通常会说的1)。

2)就这样。

3)在O(n*m*log_2(1000))中,log_2(1000)是不变的,所以它是O(n*m)

4)O(n-10)O(n)相同。 O(m/2)O(m)相同。因此,再次O(n*m)

5)平凡O(n)

6)O(log_2(m))