此代码是O(n)还是O(n²)? (Python代码)

时间:2019-04-04 15:47:45

标签: python big-o

我们的教授将此代码作为大O表示O(n)的示例。但是我不知道为什么。我认为此代码为O(n²)。我希望你能帮助我。

def g(n):
     x = n
     y = 1
     while x > 0:
          x = x - 1
          y = y + n
     while y > 0:
          y = y - 1
     return True

当我在一个循环内有一个循环时,我认为代码在O(n²)中。这段代码显示了两个单独的循环,因此应该是O(2n),但是我可以忽略常量,所以我得到了O(n)。请,如果我错了,请纠正我。

感谢您的帮助!

5 个答案:

答案 0 :(得分:5)

第一个循环是O(N)。它运行的次数与n的大小成正比。

第二个循环运行与y大小成比例的次数。由于y在循环开始时等于n ** 2,因此使其为O(N ^ 2)。

由于该函数包含一个O(N)循环和一个O(N ^ 2)循环,因此该函数总计为O(N ^ 2)。

答案 1 :(得分:0)

您的代码的复杂度为 O(n ^ 2),因为y总是从第一个循环开始总是n * n,这将n加到y n次,因此第二个循环将迭代n * n次。

答案 2 :(得分:0)

def g(n):
     x = n           # x = n
     y = 1
     while x > 0:    
          x = x - 1  # loop through x times (since x=n, n times) 
          y = y + n  # in the end, y = (1 + n) + ((1+n) + n) + (((1+n) + n) + n) ... = n + n*n
     while y > 0:    # loops n + n^2 number of times
          y = y - 1
     return True

如您所见,这是因为y的值最终为n + n ^ 2,所以O(n ^ 2)是时间复杂度。

答案 3 :(得分:-1)

在Python中,o(n ^ 2)看起来更像这样:

def g(n):
    x = n
    y = 1
    while x > 0:
        x = x - 1
        y = y + n
        while y > 0:
            y = y - 1
 return True

使嵌套循环成为n ^ 2的原因,而不是存在两个循环的事实,在Python中嵌套由缩进表示。

答案 4 :(得分:-2)

似乎您只是对python的缩进感到困惑。

这两个循环不是嵌套!,第二个循环只有在第一个循环结束时才开始,这通常具有两个循环的求和的复杂性

换句话说,第一个循环将占用O(N),因为body { font-size: 1em; /* equivalent to 16px (default font-size for browsers) */ line-height: 4; /* equivalent to 64px */ } x循环中将达到0。第二个循环将采用O(N ^ 2),因为n在第二个循环的开始将具有n ^ 2的值。

因此,总复杂度将为O(N + N ^ 2),并且您可能已经知道,Big-Oh忽略了次要术语,所以我们最终得到O(N ^ 2)。