最坏情况下使用Java算法的大O
一, (i=0;i<3;i++)的最坏情况下使用Java算法的大O,java,algorithm,big-o,Java,Algorithm,Big O,一, (i=0;i
{
对于(j=0;j<10;j++){
打印i+j;
}
}
我假设大O是30,因为最多的次数是3*10
二,
(i=0;i{
对于(j=0;j
会是O是n*m吗
三,
(i=0;i{
对于(j=0;j
n*m*对数基数2(1000)大O在nlog(n)时间内
四,
(i=0;i{
对于(j=0;j
五,
(i=0;i{
印刷品一;
}
//n和m是一些整数
对于(j=1;j
如果你知道Big O,有人能帮我一下吗?我看着这些,茫然不知所措。我希望我张贴在正确的位置,我发现这些问题很困难。谢谢你的帮助 任何常数因子都可以忽略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))
我认为重要的是要指出,大O表示法是关于函数的,给定一个任意常数,在某个点上会被认为是上界
O(1)
这是因为每个循环的迭代时间是恒定的。我们将其称为O(1)而不是O(30),因为作为上界的函数是1,具有任意常数>=30
O(n*m)
因为我们必须循环m
iterationsn
次
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(lgm)=>O(n+lgm)
所以这里有两个部分我们要看;第一个循环和第二个循环。第一个循环显然是O(n),所以这没有问题。现在第二个循环有点棘手。基本上,您可以注意到迭代器j
呈指数增长(特别是2的幂),因此循环将以指数(对数)的倒数运行。所以这个函数在O(n+lgm)中运行
大O是30
它是O(1),因为3和10都是非常小的数字。如果它们可以任意大,那就是O(N平方),好的,大O等于1是有意义的。我想30岁也是对的,但不是大会。谢谢你,我感谢你的帮助。我大部分时间都在正确的轨道上,有几次不见了。我给了你一票。@ringø:原来的格式真的很糟糕;我假设它们是两段独立的代码。好的,5更有意义。在你发表这篇文章之前,我给了你最好的评价。我真的很感激你给我的回答。
for(i = 0; i < 3; i++){
for(j = 0; j < 10; j++){
print i+j;
}
}
for(i = 0; i < n; i++){
for(j = 0; j < m; j++){
print i+j;
}
}
for(i = 0; i < n; i++){
for(j = 0; j < m; j++){
for(int k = 1; k < 1000; k *= 2){
print i+j+k;
}
}
}
for(i = 0; i < n - 10; i++){
for(j = 0; j < m/2; j++){
print i+j;
}
}
for(i = 0; i < n; i++){
print i;
}
//n and m are some integers
for(j = 1; j < m; j *= 2){
print j;
}