我对这种大O表示法表示怀疑,认为它应该是O(n ^ 3)。我的思考过程出了什么问题?
我知道嵌套的for循环是O(n ^ 2),而while循环可能是O(nlogn)函数,因为for循环是O(n)函数,而while循环的值是乘以二使其成为O(logn)。话虽这么说,答案被认为是O(n ^ 3),但我感到困惑,除非函数的递归部分与之有关?
def do_stuff2(n, x=1.23):
if n <= 0:
return 0
val = 1
for i in range(n//2):
for j in range(n//4):
x += 2*x + j/2 + i*1.2
while val <= n:
for i in range(n):
x += val**2 + i//2
val *= 2
x += do_stuff2(n - 1, x/2)
return x
我相信x不会影响大o表示法,因为它是一个常数,因为它不用于确定任何循环循环多少次。
同样,我希望函数的输出为O(n ^ 2),但实际输出为O(n ^ 3)
答案 0 :(得分:2)
您的函数有两个嵌套的for循环,即O(n^2)
:
for i in range(n//2):
for j in range(n//4):
x += 2*x + j/2 + i*1.2
但是最重要的是,您的do_stuff2()
函数接受一个参数n
并对其进行调用,直到n <= 0
,这意味着O(n)
还有一个。
答案 1 :(得分:0)
看一下函数的最后一行: x + = do_stuff2(n-1,x / 2) 这是一个递归调用。 您有n个递归调用,每个递归为O(N ^ 2),共O(N ^ 3)