Установить обложку или ударный набор; 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 ДЕЙСТВИТЕЛЬНО хорош в этом типе проблемы, но я не могу придумать, как ее использовать.

Ответы на вопрос(3)

Ваш ответ на вопрос