[英]What's the time complexity for the following python function?
def func(n):
if n == 1:
return 1
return func(n-1) + n*(n-1)
print func(5)
感到困惑。 不确定到底是什么。 是O(n)
吗?
计算n*(n-1)
是固定时间的操作。 该函数有趣的部分是调用func(n-1)
直到n
为1
为止。 该函数将进行n
此类调用,因此其复杂度为O(n)
。
如果我们假设算术运算是恒定时间运算(并且实际上是在数字相对较小的时候),那么时间复杂度为O(n)
:
T(n) = T(n-1) + C = T(n-2) + C + C = ... = n * C = O(n)
但是实际中乘法的复杂度取决于底层类型(而我们谈论的是Python取决于类型的值)。 当N
接近无穷大时,它取决于N
因此,严格来说,复杂度等于:
T(n) = O(n * multComplexity(n))
并且此multComplexity(n)
取决于用于大数乘法的特定算法。
如其他答案中所述,出于实用目的,答案接近O(n)
。 为了进行更精确的分析,如果您不想近似地认为乘法是恒定时间的:
计算n*(n-1)
需要O(log n * log n)
(或O(log n)^1.58
,取决于Python使用的算法,该算法取决于整数的大小)。 请参阅此处 -请注意,由于复杂度与位数有关,因此我们需要log
。
将两个项相加需要O(log n)
,所以我们可以忽略它。
乘法完成O(n)
次,因此总数为O(n * log n * log n)
。 (可能有可能使此约束更严格,但它肯定大于O(n)
-请参见WolframAlpha图 )。
实际上,除非n
很大,对log
项才真正重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.