#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)