函数O(n ^ 3)的Big O如何?

时间:2019-05-29 10:39:17

标签: python big-o

我对这种大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)

2 个答案:

答案 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)