Учитывая этот вход: [1,2,3,4]
Я хотел бы создать набор связующих наборов:
[1] [2] [3] [4]
[1] [2] [3,4]
[1] [2,3] [4]
[1] [3] [2,4]
[1,2] [3] [4]
[1,3] [2] [4]
[1,4] [2] [3]
[1,2] [3,4]
[1,3] [2,4]
[1,4] [2,3]
[1,2,3] [4]
[1,2,4] [3]
[1,3,4] [2]
[2,3,4] [1]
[1,2,3,4]
У каждого набора есть все элементы исходного набора, переставленные, чтобы появиться в уникальных подмножествах. Каков алгоритм, который производит эти наборы? Я пробовал функции генератора Python, используя выбор, перестановку, комбинацию, набор мощности и т. Д., Но не могу получить правильную комбинацию.
20 января 2009
Это не домашнее задание. Это улучшенный ответ, над которым я работал для проблемы www.projecteuler.net # 118. У меня уже было медленное решение, но я нашел лучший способ - за исключением того, что я не мог понять, как сделать набор связывания.
Я опубликую свой код, когда вернусь с инаугурации.
21 января 2009
Это возможный алгоритм, который я использовал:
def spanningsets(items):
if len(items) == 1:
yield [items]
else:
left_set, last = items[:-1], [items[-1]]
for cc in spanningsets(left_set):
yield cc + [last]
for i,elem in enumerate(cc):
yield cc[:i] + [elem + last] + cc[i+1:]
@ Yuval F: Я знаю, как сделать powerset. Вот простая реализация:
def powerset(s) :
length = len(s)
for i in xrange(0, 2**length) :
yield [c for j, c in enumerate(s) if (1 << j) & i]
return