[英]Time and Space Complexity of 2 Functions
def bar(n):
if n==0:
return 0
else:
return n+bar(n-1)
def foo(n):
if n==0:
return 0
else:
return bar(n)+foo(n-1)
嗨,我剛剛了解了時空復雜性。 誰能和我確認我是否正確地說foo
的時間復雜度為O(n ** 2)和foo
的空間復雜度為O(n)? 由於foo
調用bar
本身僅調用一次,而foo
始終調用2個函數,因此不太確定時間復雜度。
每次你調用時foo
與可以說T
作為輸入參數,你打電話bar
,從1
到T - 1
。 這意味着您正在執行以下操作:
foo's input bar's inputs
1 1,
2 2, 1,
3 3, 2, 1
4 4, 3, 2, 1
...
n n, n-1, n-2, ...
因此,呼叫數量如下:
1, 2 , 3 , 4 , ... t
1 ,(1+2) , (1+2+3) , (1+2+3+4) , ... (t+t-1+t-2+...+1)
這是一個遞歸方程,您可以將bar
的遞歸方程代替n
並簡單地找到大O
這意味着foo
的復雜度為O(t 2 ),並且由於bar
的復雜度為O(n)
通過將foo
的方程式中放置n
,您將獲得O(n 2 )。
您還可以通過在bar
的return
行之前添加print('*')
非常簡單地進行檢查,以檢查呼叫次數:
In [42]: foo(2)
*
*
*
Out[42]: 4
In [43]: foo(3)
*
*
*
*
*
*
Out[43]: 10
In [44]: foo(4)
*
*
*
*
*
*
*
*
*
*
Out[44]: 20
如您所見,有2個電話有3個電話,有3個電話有6個電話,有4個電話有10個電話。
你是對的。 這里的空間復雜度實際上是程序執行期間調用堆棧的最大深度,它是O(n)
。 對於foo
時間復雜度,您可以計算函數調用的次數:
NC(foo(n)) = NC(bar(n)) + NC(foo(n-1)) + 1
既然很明顯NC(bar(n)) = n + 1
,我們就擁有了(忽略那些常量“ +1”部分):
NC(foo(n)) = n + NC(foo(n-1)) = n + (n-1) + NC(foo(n-2)) =
= n + (n-1) + ... + 1 = n(n+1)/2 = O(n^2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.