Учитывая этот ввод: [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. У меня уже было медленное решение, но придумал лучший способ - кроме того, что я не мог понять, как сделать набор spanning.
Я отправлю свой код, когда вернусь из Инаугурации.
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: Я знаю, как сделать poweret. Здесь простая реализация:
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