Здравствуйте, я только что решил leetcode 254 [https://leetcode.com/problems/factor-combinations/], цель этого алгоритма - найти все уникальные комбинации факторов для данного числа n
(пример: для n = 8
мы возвращаем [[2 x 2 x 2], [2 x 4]]
)и написал следующий код:
def getFactors(self, n: int) -> List[List[int]]:
def helper(n, cur, path, ind, factors):
if cur == n:
res.append(path[:])
return
for i in range(ind, len(factors)):
if cur * factors[i] <= n:
path.append(factors[i])
helper(n, cur * factors[i], path, i, factors)
path.pop()
res = []
helper(n, 1, [], 0, [num for num in range(2, n) if n % num == 0])
return res if res != [[]] else []
Способ работы этого алгоритма заключается в том, что я перебираю все факторы и умножаю cur
на коэффициент, над которым я перебираю, и до тех пор, пока cur * factors[i] <= n
я могу добавить, чтос учетом моего path
и продолжаю повторяться.
Хотя я не могу понять сложность времени в терминах n
. Я могу сказать, что в худшем случае дерево рекурсии будет иметь глубину log n
(это было бы 2 x 2 x 2 ... x 2
, если n
- степень 2), но я застрял в понимании фактора ветвления для этого дерева.
Любая помощь в расчете временной сложности этого алгоритма приветствуется, но я был бы очень признателен за интуитивный способ взглянуть на него (то, что я могу воспроизвести в интервью) ... более формальные методы такжедобро пожаловать.
РЕДАКТИРОВАТЬ 1:
Таким образом, я могу сказать, что это повторение имеет log(n)
ответвлений (количество факторов) и log(n)
глубину в худшем случае, что приводит к времени выполнения O(log(n)^log(n))
это рассуждение хорошо?
РЕДАКТИРОВАТЬ 2:
Однако другой способ взглянуть на это, у нас есть O(log(n))
факторов, и мы просто делаем подмножество всех возможных комбинаций, что является2^n
упражнение, в результате чего 2^log(n) = n
различных решений. И для каждого из n
решений у нас есть log(n)
(глубина дерева) умножения, приводящие к O(nlog(n))
времени выполнения ... поэтому мой вопрос -> Какой анализ является правильным?