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,有人可以帮我一把。我正在看着这些而且不知所措。我希望我在正确的位置张贴这个,我发现这些问题很难。我感谢任何帮助。
答案 0 :(得分:4)
我认为重要的只是指出Big O符号是关于函数的,给定任意常量,在某些时候将被视为上界。
O(1)
这是因为每个循环在恒定时间内迭代。我们将其称为O(1)而不是O(30),因为作为上限的函数是1,具有任意常数&gt; = 30。
O(n * m个)
只是因为我们必须循环m
次迭代n
次。
O(n * m个)
这与前一个相同,只是我们在中间抛出另一个循环。现在您可以注意到,这个循环与第一个问题类似,只是一个恒定的时间。因此,你甚至不需要花时间弄清楚它循环的频率,因为它总是不变的 - 它是O(1)并且会被解释为O(n * m * 1)我们可以简单地叫O(n * m)
O(n * m个)
对于外循环,不要陷入.. - 10
并意识到我们可以说循环在O(n)中运行。我们可以忽略.. - 10
,因为我们忽略了第一个问题中的确切值; 常数并不重要。同样的原则适用于m/2
,因为您可以认为m
只是被1/2
的常量操纵。所以我们可以称之为O(n * m)。
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))
。