我需要为给定的大小为n的组找到大小为m的所有子集的集合。因此,在我的算法的最简单版本中,我使用 itertools.combinations(),但由于n = 566和m = 11,即使我等了10个小时,我也无法达到计算结束进程返回已杀死:9 。此外,我需要将一组集合作为对象(其中集合的元素也是集合)而不是元组列表,以便在计算上使问题更加复杂。
from itertools import combinations, product
S = set()
Sf = frozenset(combinations(xrange(1, 566), 11))
for i in Sf:
t = frozenset(i)
S.add(t)
更软化的版本是在两个集合A和B上使用 intertools.combinations(),其中n = 566和m = 2和9(我将其称为d和k)然后最终集合S由这两个元素的元素(a和b元素的a和b)的并集构成,其中S = {t =a∪b:A中的a,b中的b, a∩b= 0}
A = set()
As = frozenset(combinations(xrange(1, 566), 2))
for i in As:
a = frozenset(i)
A.add(a)
B = set()
Bs = frozenset(combinations(xrange(1, 566), 9))
for j in Bs:
b = frozenset(j)
B.add(b)
ab = set()
ba = set()
for i in A:
for j in B:
if i.issubset(j):
ab.add(i)
ba.add(j)
A_ab = A.difference(ab)
B_ba = B.difference(ba)
S = frozenset(product(B_ba, A_ab))
最后我认为我的问题是计算时间和内存使用情况(我在i7 1.7 GHz和8 GB的RAM mac上使用python 2.7.9)。显然,如果有一个更有效和优化的算法,它会受欢迎!