【发布时间】:2016-06-13 17:17:17
【问题描述】:
虽然这个问题是使用 Python 编程语言制定的,但我相信它更多的是一个编程逻辑问题。
我有一个所有可能组合的列表,即:n 选择 k
我可以使用
来准备这样的列表import itertools
bits_list = list(itertools.combinations(range(n), k))
如果“n”为 100,“k”为 5,则“bits_list”的长度为 75287520。
现在,我想修剪此列表,使数字分组显示,或者不分组。让我们以以下集合为例:
第 1 组:[0, 1, 2]
第 2 组:[57, 58]
第 3 组:[10、15、20、25]
第 4 组:[10、11、12、13、14、15、16、17、18、19]
这里每个集合都需要一起出现在 bits_list 的任何成员中,或者根本不出现。
到目前为止,我只能想到一个蛮力的 if-else 方法来解决这个问题,但是这样 if-else 条件的数量会非常多。
这是我所拥有的:
bits_list = [x for x in list(itertools.combinations(range(n), k))
if all(y in x for y in [0, 1, 2]) or
all(y not in x for y in [0, 1, 2])]
现在,这仅涵盖第 1 组。我想为许多组执行此操作。如果集合的长度大于 k 的值,我们可以忽略该集合(例如,k = 5 和集合 4)。
请注意,最终目标是让“k”在一个范围内迭代,比如 [5:25] 并处理附加列表。列表的大小在这里呈指数增长,从计算上讲,非常昂贵!
如果 'k' 为 10,python 解释器会在任何具有 16 GB RAM 的普通笔记本电脑上完成之前中断进程。我需要找到一个适合相对现代服务器(不是集群或服务器场)内存的解决方案。
非常感谢任何帮助!
P.S.:直觉上,将这个问题想象成为登上公共巴士或火车系统的人生成所有可能的案例。通常,您会登上整个团队,或者您不登上任何人。
更新:
对于上述给定的集合,如果 k = 5,则 bits_list 的有效成员将是 [0, 1, 2, 57, 58],即:Set1 和 Set2 的组合。如果 k = 10,那么我们可以构建 Set1 + Set2 + Set3 + NoSetElement 作为可能的成员。 @DonkeyKong 的解决方案让我意识到我没有在我的问题中明确提到这一点。
我有很多套;我打算使用足够的集合来修剪完整的组合列表,以便 bits_list 最终适合内存。
@9000 的建议在这里完全有效,即在每次迭代期间,我可以将组合保存为实际位。
【问题讨论】:
-
这个问题可能更适合计算机科学堆栈交流
-
您是在火车上接人还是在上车?
-
所以你肯定需要一个实际的列表,在内存中,有这么多项目?因为这就是你的瓶颈所在。
-
您是否尝试计算有效或输出它们的组合?
-
@DaveGalvin,我正在使用这些组合对我选择的项目执行进一步的操作。