[英]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.