Установить обложку или ударный набор; Numpy, Наименьшие комбинации элементов, чтобы составить полный набор
Моя цель - найти как можно меньшее количество подмножеств [a-f], чтобы составить полный набор A.
A = set([1,2,3,4,5,6,7,8,9,10]) # full set
#--- below are sub sets of A ---
a = set([1,2])
b = set([1,2,3])
c = set([1,2,3,4])
d = set([4,5,6,7])
e = set([7,8,9])
f = set([5,8,9,10])
В действительности родительский набор A, с которым я имею дело, содержит 15 тыс. Уникальных элементов с 30 тыс. Подмножеств, и эти подмножества варьируются по длине от одного уникального элемента до 1,5 тыс. Уникальных элементов.
На данный момент код, который я использую, выглядит более или менее следующим образом и является PAINFULLY медленным:
import random
B = {'a': a, 'b': b, 'c': c, 'd': d, 'e': e, 'f': f}
Bx = B.keys()
random.shuffle(Bx)
Dict = {}
for i in Bx: # iterate through shuffled keys.
z = [i]
x = B[i]
L = len(x)
while L < len(A):
for ii in Bx:
x = x | B[ii]
Lx = len(x)
if Lx > L:
L = Lx
z.append(ii)
try:
Dict[len(z)].append(z)
except KeyError:
Dict[len(z)] = [z]
print Dict[min(Dict.keys()]
Это просто, чтобы дать представление о подходе, который я выбрал. Для ясности я исключил некоторую логику, которая минимизирует итерации для наборов, которые уже слишком велики, и тому подобное.
Я полагаю, что Numpy ДЕЙСТВИТЕЛЬНО хорош в этом типе проблемы, но я не могу придумать, как ее использовать.