我必须记下算法的Big 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++)
{
..
}
}
但是,对于另一个问题,我必须经历世界的下半部分,所以我的y循环减半。
int[][] world = new world[20][20];
for (int x = 0; x < 20; x++)
{
for (int y = 10; y < 20; y++)
{
..
}
}
我不太确定Big O符号适用于上述循环,它仍然是O(n^2)
,因为世界变得越大它仍然会变慢吗?或者它是O(log n)
,因为y减半了?
答案 0 :(得分:10)
它简单地说O(n*n/2)=O(n^2)
,因为常量不在大O中。
答案 1 :(得分:4)
它是O(n^2)
,因为y仍然是n的函数,即O(n^2/2)
仍为O(n^2)
。
答案 2 :(得分:4)
你的两个算法实际上都是O(n)(假设n是输入中的位数,这是常见的定义)。第一个触摸世界数组中的每个“像素”一次,因此很容易看出它是O(n)。第二个接触一半像素,但由于O(n / 2)= O(n),仍然是O(n)。在这两种情况下,将世界数组的大小加倍会使执行时间增加或减少一倍,这是O(n)算法的典型特征。