簡體   English   中英

在每次迭代中產生 n - (i + 2) function 調用的遞歸 function 的時間復雜度是多少?

[英]What is the time complexity of a recursive function that spawns n - (i + 2) function calls on each iteration?

我正在研究一個名為 house robber 的 DP 問題,我已經使用 DP 方法解決了這個問題,但我最初的想法是使用以下遞歸 function:

def rec(self, start, possible):
        if len(possible) == 0:
            return start
        
        money = start
        for i, num in enumerate(possible):
            nextMoney = self.rec(start + num, possible[i+2:])   
            money = max(money, nextMoney)
            
        return money
            
            
    def rob(self, nums: List[int]) -> int:
        # Base Case
        if(len(nums) == 0):
            return 0
        elif len(nums) == 1:
            return nums[0]
        
        path1 = self.rec(nums[0], nums[2:])
        path2 = self.rec(nums[1], nums[3:])
        
        # Recursion
        return max(path1, path2)

我的 DP 解決方案是 O(n) 但我正在努力確定上述算法的時間復雜度。 我的直覺說它的指數順序為 log(n) = O(n ^ log (n))

如果有人能在這里指出我正確的方向,那將不勝感激。 謝謝。

問題參考: https://leetcode.com/problems/house-robber/

該代碼枚舉了 1..n 的所有子集,沒有兩個相鄰的數字。 你做了很多possible的切片,每次調用都會產生 O(n^2) 成本,所以遞歸關系是:

T(n) = n^2 + sum(T(i) for i=0..n-2)

從 T(n-1) 中減去 T(n):

T(n) - T(n-1) = n^2 - (n-1)^2 + T(n-2)
T(n) = 2n - 1 + T(n-1) + T(n-2)

U(n) = T(n) + 2n + 5 ,所以T(n) = U(n) - 2n - 5 代入T(n)T(n-1)T(n-2)我們得到:

U(n) - 2n - 5 = 2n - 1 + U(n-1) - 2(n-1) - 5 + U(n-2) - 2(n-2) - 5
U(n) = U(n-1) + U(n-2) (simplifying)

所以 U(n) = Fib(n)(即:斐波那契數),並且 T(n) = Fib(n) - 2n - 5。

所以你的運行時間是 Theta(Fib(n)),也就是 Theta(phi^n),其中 phi 是黃金比例。

[一個有趣的注意事項是,如果您刪除了導致 O(n^2) 每次調用成本的列表切片,那么您的代碼的復雜性 class 將是相同的——切片的成本會丟失在其他指數成本中代碼]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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