Реализация алгоритма нахождения множества всех подмножеств (powerset) на Python
Для реализации алгоритма нахождения множества всех подмножеств (powerset algorithm) на Python можно использовать рекурсивный или итеративный подход. Вот пример каждого из них:
Рекурсивный подход
def powerset(s):
"""
Returns the powerset of a given set s.
"""
if not s:
return [set()]
all_but_last = powerset(s[:-1])
last = s[-1]
return all_but_last + [x | {last} for x in all_but_last]
Эта функция принимает множество s
в качестве входных данных и возвращает его множество всех подмножеств. Функция работает путем рекурсивной генерации множества всех подмножеств всех элементов, кроме последнего, а затем добавления последнего элемента к каждому из этих подмножеств.
Вот пример использования:
>>> powerset({1, 2, 3})
[set(), {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}]
Итеративный подход
def powerset(s):
"""
Returns the powerset of a given set s.
"""
powerset = [set()]
for elem in s:
powerset += [subset | {elem} for subset in powerset]
return powerset
Эта функция также принимает множество s
в качестве входных данных и возвращает его множество всех подмножеств. Функция работает, начиная с пустого множества, а затем итеративно добавляя каждый элемент исходного множества к существующим подмножествам.
Вот пример использования:
>>> powerset({1, 2, 3})
[set(), {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}]
Оба этих подхода имеют временную сложность O(2^n), где n - количество элементов в исходном множестве, так как множество всех подмножеств множества с n элементами содержит 2^n элементов.