Java 大O表示二维for循环

Java 大O表示二维for循环,java,algorithm,big-o,Java,Algorithm,Big O,我必须写下一个算法的大O符号,我必须为我的家庭作业想出这个算法 我能看出下面的代码是O(n^2)。因为对于每一个x,我必须通过所有的y,并且随着世界变得更大,它变得更慢 int[][] world = new world[20][20]; for (int x = 0; x < 20; x++) { for (int y = 0; y < 20; y++) { .. } } int[]world=新世界[20][20]; 对于(int x=0

我必须写下一个算法的大O符号,我必须为我的家庭作业想出这个算法

我能看出下面的代码是
O(n^2)
。因为对于每一个x,我必须通过所有的y,并且随着世界变得更大,它变得更慢

int[][] world = new world[20][20];
for (int x = 0; x < 20; x++)
{
    for (int y = 0; y < 20; y++)
    {
        ..
    }
}
int[]world=新世界[20][20];
对于(int x=0;x<20;x++)
{
对于(int y=0;y<20;y++)
{
..
}
}
但是,对于另一个问题,我必须穿过世界的下半部分,所以我的y循环被减半

int[][] world = new world[20][20];
for (int x = 0; x < 20; x++)
{
    for (int y = 10; y < 20; y++)
    {
        ..
    }
}
int[]world=新世界[20][20];
对于(int x=0;x<20;x++)
{
对于(int y=10;y<20;y++)
{
..
}
}

我不太确定什么大O表示法适合上面的循环,它是否仍然
O(n^2)
,因为世界越大,它仍然变得越慢?或者它是因为y被减半了吗?

它只是简单地说
O(n*n/2)=O(n^2)
,因为在大O中不考虑常数。

它是
O(n^2)
因为y仍然是n的函数,也就是说
O(n^2/2)
仍然是
O(n^2)

你的两个算法实际上都是O(n)(假设n是输入中的位数,这是常见的定义)。第一个接触世界数组中的每个“像素”一次,因此很容易看到它是O(n)。第二个接触一半像素,但仍然是O(n),因为O(n/2)=O(n)。在这两种情况下,将世界数组的大小增加一倍或多或少会使执行时间增加一倍,这是典型的O(n)算法。

O(n*n/2)=1/2*O(n^2)=O(n^2)
AFAICS这两种算法都以恒定的时间运行并使用恒定的存储。我想我不同意你的看法,因为大(O)符号指的是真正大值的行为(如无限)两个无穷大中的一个被2除的事实没有多大变化,它仍然可以归结为n平方。第一行是循环中可变终端值的一般解,第二行是问题的特殊解。很抱歉,我不理解你的评论。据我所知,第一个解是O(n^2).第二种解决方案使用相同的算法,只在较小的数据集上使用。数据更改的事实不会修改算法的BigO值。不是吗?哦,是的,我同意。对此表示抱歉。修改了答案。感谢您指出。@ShivanDragon感谢您指出,数据更改不会修改算法的BigO值,我对此感到困惑!但是对于每个
x
都有同样多的
y
,所以它是二次的,对吗?当然,如果你设置n=x=y,那么它将显示为O(n^2)n的典型定义是输入的大小,但在本例中表示n=x*y*32。从理论上讲,这个答案是正确的。传统上,大O表示法中的
n
表示输入大小。在本例中,输入大小为20x20,因此
n=400
。然而,它也常用于表示
n
ode>m
作为问题的两个维度,并产生复杂度函数f(n,m)@finalman啊,我明白你的意思。但在这个例子中
n^2
只是表明算法中有两个循环?Kevin两个嵌套的循环确实使它乍看起来像一个O(n^2)算法。但是在这种情况下,它不是(当然,这取决于您定义n的内容)。请注意,您可以将算法重写为具有一个循环的版本,从0循环到x*y。