Dav*_*pes 2 python math combinations combinatorics
假设我有一个巨大的元组列表:
tuples = ([1, 2], [2, 1], [3, 2], [25, 73], [1, 3]...)
Run Code Online (Sandbox Code Playgroud)
截至目前,该列表有 360000 个元素(它们是互质数列表)。我需要组合 3 个元组,这样每个组合上只有 3 个不同的数字,例如:
([2, 1], [3, 1], [3, 2])
([2, 1], [5, 1], [5, 2])
Run Code Online (Sandbox Code Playgroud)
在生成组合列表时,我需要丢弃具有 4 个或更多不同数字的组合。
如果我尝试暴力破解并测试每个组合,我最终会得到360000 choose 3哪些7.77 * 10^15可能的组合进行测试。
编辑:我试图解决的问题是:
找到以下形式的互质对的所有组合:
(a, b), (a, c), (b, c)
Run Code Online (Sandbox Code Playgroud)
对于 c < 120000
我采取的步骤:
让我们制作一个将所有较大元素映射到元组中较小元素的集合字典:
d = {}
for tup in tuples:
# here you may limit max(tup) to 120000
d.setdefault(min(tup), set()).add(max(tup))
# {1: {2, 3}, 2: {3}, 25: {73}}
Run Code Online (Sandbox Code Playgroud)
这也消除了所有对称对:(1, 2), (2, 1)。
然后搜索所有工作组合:
for a, bc in d.iteritems():
for b, c in it.combinations(sorted(bc), 2):
if b in d and c in d[b]:
print(a, b, c) # or yield or append to a list
Run Code Online (Sandbox Code Playgroud)
应该比你的蛮力还快……