复杂性分析&复发关系

时间:2017-12-02 15:34:07

标签: algorithm time-complexity

我试图找到以下两个递归函数的复杂性,但不知道如何处理递归函数的复杂性分析

查找所有可能的子集

AppleLanguages

查找所有可能的排列

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

此外,函数的递归关系是什么

1 个答案:

答案 0 :(得分:0)

如果T(n) = T(n-1) + T(n-2) + ... + T(1) + 1的长度为nums,则第一个算法的时间复杂度关系为n。现在尝试通过扩展等式来解决这个问题。

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^2适用于大小为n的数组的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)!)