以下python函数的时间复杂度是多少?

时间:2017-08-08 07:33:25

标签: python time-complexity

def func(n):
    if n == 1:
        return 1
    return func(n-1) + n*(n-1)

print func(5)

感到困惑。不知道究竟是什么。是O(n)吗?

3 个答案:

答案 0 :(得分:4)

计算n*(n-1)是固定时间操作。函数的有趣部分是调用func(n-1),直到n1。该函数将进行n这样的调用,因此它的复杂性为O(n)

答案 1 :(得分:1)

如果我们假设算术运算是常数时间运算(并且它们确实是数字相对较小时),那么时间复杂度为O(n)

T(n) = T(n-1) + C = T(n-2) + C + C = ... = n * C = O(n)

但实践中的乘法复杂性取决于底层类型(我们讨论的是类型取决于值的Python)。这取决于NN接近无穷大。因此,严格来说,复杂性等于:

T(n) = O(n * multComplexity(n))

multComplexity(n)取决于用于大数字乘法的特定算法。

答案 2 :(得分:0)

如其他答案中所述,出于实际目的,答案接近O(n)。为了更精确的分析,如果你不想做乘法是恒定时间的近似值:

计算n*(n-1)需要O(log n * log n)(或O(log n)^1.58,具体取决于Python使用的算法,具体取决于整数的大小。请参阅here - 请注意,我们需要使用log,因为复杂性与位数有关。

添加这两个词需要O(log n),所以我们可以忽略它。

乘法完成O(n)次,因此总计为O(n * log n * log n)。 (有可能让这个更严格,但它肯定比O(n)更大 - 见WolframAlpha plot)。

在实践中,除非log变得非常大,否则n条款确实无关紧要。