簡體   English   中英

復雜性分析與遞歸關系

[英]Complexity analyisis & recurrence relations

我正在嘗試為以下兩個遞歸函數查找復雜性,但不知道如何對遞歸函數進行復雜性分析

查找所有可能的子集

def subsetsHelper(self, nums, index, path, res):
    if path is None:
        return
    res.add(path)
    for i in range(index, len(nums)):
        self.subsetsHelper(nums, i + 1, path + [nums[i]], res)

def subsetsWithDup(self, nums):
    res = []
    self.subsetsHelper(nums, 0, [], res)
    return res

查找所有可能的排列

def permuteHelper(self, nums, index, path, res):
    if len(nums) == 0:
        res.append(path)

    for i in range(len(nums)):
        copy = list(nums)
        val = copy.pop(i)
        self.permuteHelper(copy, i, [val] + path, res)

def permute(self, nums):
    res = []
    self.permuteHelper(nums, 0,[], res)
    return res

另外,函數的遞歸關系是什么

如果nums的長度為n ,則第一種算法的時間復雜度關系為T(n) = T(n-1) + T(n-2) + ... + T(1) + 1 現在嘗試通過擴展方程式解決這個問題。

T(n) = T(n-1) + T(n-2) + ... + T(1) + 1
T(n) = (T(n-2) + T(n-3) + ... + T(1) + 1) + T(n-2) + ... + T(1) + 1 
T(n) = 2T(n-2) + 2T(n-3) + ... + 2T(1) + 2
T(n) = 2(T(n-3) + T(n-4) + ... + T(1) + 1) + 2T(n-3)... + 2T(1) + 2  
T(n) = 2^2 T(n-3) + 2^2 T(n-4) + ... + 2^2T(1) + 2^2

因此, T(n) = O(2^n)

如注釋中所述,對於第二種算法,您在每次迭代中都有一個副本,並且將函數除其中一個以外的其他數組都調用。 因此, T(n) = n * T(n-1) + n^2n^2n與尺寸數組的拷貝n )。 使用擴展,我們將有:

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

因此T(n) = O((n + 1)!)

暫無
暫無

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

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