簡體   English   中英

2種功能的時空復雜度

[英]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 ,從1T - 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 )。

您還可以通過在barreturn行之前添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM