我们的教授将此代码作为大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)。请,如果我错了,请纠正我。
感谢您的帮助!
答案 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)。