Что такое хорошая реализация алгоритма Power Set?

Недавно мне понадобился этот алгоритм для создания решателя для моей головоломки. Как правило, решатель должен опробовать стратегии (наборы ходов, возможные наборы поворотов Power) и найти стратегию, которая формирует решение.

Я узнал, что наивная реализация показана на странице Википедии, а также на странице js-combinatorics в библиотеке отсутствует порядок сгенерированных подмножеств. Кроме того, наивный подход, использующий биекцию набора в набор натуральных чисел и последующее двоичное представление, ограничен размером исходного набора. Это ограничение естественно возникает из-за того, что внутренне упомянутая библиотека использует 32-битное целочисленное значение для генерации подмножеств.

0
Vladimir Ignatyev 29 Фев 2020 в 21:58

2 ответа

Лучший ответ

Используйте реализацию из рецептов itertools:

from itertools import chain, combinations
def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
print(*powerset([1,2,3])) 

Выход:

() (1,) (2,) (3,) (1, 2) (1, 3) (2, 3) (1, 2, 3)

Он производит кортежи - но вы можете конвертировать их, как вам нравится. Это выглядит также намного короче, чем ваше решение ...

1
Patrick Artner 29 Фев 2020 в 19:02

Вероятно, Stackoverflow - не лучший вариант для обмена фрагментами Gist, но есть связанные вопросы, и я решил поделиться своим фрагментом здесь, полагая, что он может быть полезен для людей, которые ищут реализацию алгоритма Power Set, и для сообщества Stackoverflow. сам.

https://gist.github.com/vladignatyev/e76b5fd1c3cdfff7034ce17506fae36e

Моя реализация может быть трудной для понимания. Пожалуйста, поделитесь со мной своими вопросами, улучшениями и предложениями, связанными с этой частью программного обеспечения с открытым исходным кодом свободно!

Usage:
    >>> ps = power_set([1,2,3])
    >>> for ss in ps:
            print(ss)
Output:
    [], 
    [1], 
    [2], 
    [3], 
    [1, 2], 
    [1, 3], 
    [2, 3], 
    [1, 2, 3]
0
Vladimir Ignatyev 29 Фев 2020 в 18:58