Leetcode 78 — Сложность времени генерации набора мощности

#python #algorithm #time-complexity #code-complexity

#python #алгоритм #временная сложность #сложность кода

Вопрос:

Вопрос Leetcode 78 потенциальное решение:

 class Solution(object):
    def __init__(self):
        self.map = {}
    
    def helper(self, count, nums, vals, result):       
        
        if count == 0:
            result  = [vals]        
            
        for i in range(len(nums)):
            self.helper(count - 1, nums[i 1:], vals   [nums[i]], result)
        
    
    def subsets(self, nums):
        result = []
        result.append([])
        
        for count in range(1,len(nums) 1):
            self.helper(count, nums, [], result)   
            
        return result
 

Для приведенного выше решения будет ли временная сложность O (2 ^ n) или O (n * 2 ^ n)?

Ответ №1:

Можно узнать сложность, посмотрев N , сколько раз вызывается helper функция, по коду будет выглядеть следующим образом:

 class Solution(object):

    def __init__(self):
        self.map = {}
        self.counter = 0

    def helper(self, count, nums, vals, result):
        self.counter  = 1
        if count == 0:
            result  = [vals]

        for i in range(len(nums)):
            self.helper(count - 1, nums[i   1:], vals   [nums[i]], result)

    def subsets(self, nums):
        result = [[]]

        for count in range(1, len(nums)   1):
            self.helper(count, nums, [], result)

        return self.counter
 

Итак, для:

N Время вызова вспомогательной функции
1 2
2 8
3 24
4 64
5 160
6 384
7 896
8 2048
9 4608
10 10240
….
N O(n * 2^n)

helper Функция имеет сложность O(2^n) и поскольку вы вызывали для каждого элемента списка nums :

 for count in range(1,len(nums) 1):
    self.helper(count, nums, [], result)  
 

общая временная сложность O(n * 2^n)