【发布时间】:2018-11-27 20:58:35
【问题描述】:
假设我有 N (1 ≤ N) 数字,1 .. N,有效地生成最大可能的 L (1 ≤ L ≤ N) 数量,其大小为 combinations组合的任何U 长度子集 (1 ≤ U ≤ L) 的限制只在结果中出现一次。通常有许多结果满足约束条件 - 任何结果都可以。
例如,如果N 是 5,L 是 3,并且最终的约束被删除(即答案只是组合),那么我们有:
123,124,125,134,135,145,234,235,245,345;
一旦引入U is 2 约束,这些行中的任何一个都是可接受的解决方案,只要它是有效生成的:
123,145;
123,245;
123,345;
124,135;
124,235;
124,345;
125,134;
125,234;
125,345;
理想的运行时间是 O(size_of_output)。在我的用例中,N 总是比 L 大得多(一个数量级或更多),因此任何比计算所有组合更快的方法都将是对我提出的改进的改进(这太慢了):
import itertools
def unique_combinations(population, length, unique):
seen = set()
for r in itertools.combinations(range(population), length):
u = set(itertools.combinations(r, unique))
if not (u & seen):
yield r
seen |= u
提供一种从有效解决方案列表中确定性地选择任何给定解决方案的方法的奖励积分。例如,上面的 (N=5,L=3,U=2) 示例有 9 个有效解决方案。能够选择返回的附加参数 1 .. 9 会非常好。
计算结果中组合数量的简单公式也会有所帮助。
【问题讨论】:
-
你已经展示了 123 的 2 对,而有你的:
123 145; 123 245; 123 345所以你的例子似乎确实存在 18 个变体。 -
MBo - 您的所有三个组合共享一对
45。它最多可以在其中一个中。 -
还不明白。你的四个组合共享对 45
-
我对你的输出有点困惑。你说你是从一个组合池中提取的,但是为什么你的输出被打乱了?
-
OP,我认为您误读了@MBo 的评论。您不能在 cmets 中添加换行符,所以这里分号表示句点和换行符在您的问题中的含义:这些是大小 L=2 的三个独立组合,其中没有一个大小为 U=2 的共享子集.