为什么复杂度为O(log(n ^ 2)*(log(n))

时间:2019-06-11 13:16:53

标签: time-complexity big-o

此代码的复杂度为O(log(n ^ 2)* log(n),我不明白我们如何得出此结果。

根据我的说法,嵌套的while的大O应该是log(n),因为它是一个while循环,每次进入循环时,j都会除以4,对于初始的while循环,i等于2。特别是不了解哪个while循环的复杂度为O(log ^ 2(n))

c = 0
i = n * n
while i > 0:
    j = n
    while j > 0:
        c += 1
        j = j//4
    i = i//2
print c

1 个答案:

答案 0 :(得分:2)

我似乎想出了O(log_4(n)*log_2(n))作为复杂性。首先,请注意,外部while和内部i循环是不相关的。也就是说,j中的外部循环独立于n中的内部循环。根据{{​​1}},这是外循环和内循环的复杂性:

  • 外循环:O(log_2(n))。这是因为循环从n^2开始,然后将计数器递减2,这就是log_2的行为。正如@chepner所说:

    O(log_2(n^2)) == 2*O(log_2(n)) = O(log_2(n))

  • 内循环:O(log_4(n))。此循环从n开始,并将计数器减少4倍,这就是log_4的行为。

您当前的猜测几乎是正确的,只是您可能错过了对数的底数。