Код: Выделить всё
def powerset(s, i, cur):
if i==len(s):
print(cur)
return
powerset(s, i+1, cur+s[i]) # string addition is also possibly O(n^2) here?
powerset(s, i+1, cur)
powerset("abc", 0, "")
Код: Выделить всё
['abc', 'ab', 'ac', 'a', 'bc', 'b', 'c', '']
Также думая об этом с точки зрения ветвей^глубина = O(2^n)
Пространственная сложность для этого будет: O(n)? Учитывая, что максимальная глубина дерева должна достигать n по приведенной выше логике.
И при этом:
Код: Выделить всё
s = "abc"
res = [""]
for i in s:
res += [j+i for j in res]
Но здесь я вижу 2 цикла for и дополнительную сложность создания строк, которая, возможно, равна O(n^2) в Python. Это приводит к возможному O(N^4) в отличие от O(n*2^n) в приведенном выше решении.
Пространственная сложность здесь кажется мне O(n), поскольку мы резервируем место только для вывода. Но дополнительного места нет, так что в целом: O(1)
Правильно ли я понимаю эти решения во времени и пространстве? У меня сложилось впечатление, что набор вычислительных мощностей равен O(2^n). Но я подумал, может быть, это более оптимизированное решение? (хотя второе решение кажется более наивным).
https://stackoverflow.com/questions/340 ... -on2-or-on
Здесь они предлагают использовать массивы, чтобы избежать сложности строки `O(n^2)` конкатенация.
Мобильная версия