有效生成组合,而没有重复的子集

时间:2018-11-26 07:06:24

标签: algorithm combinations

鉴于我有N(1≤N)个数字1 .. N,可以有效地生成最大数量的L(1≤{L≤{ {1}}的大小combinations,其限制是组合(1≤{NU)的任何U长度子集在结果中仅出现一次。通常,有很多结果满足约束条件,任何结果都可以。

例如,如果L为5,N为3,并且删除了最终约束(即答案只是组合),则我们有:

L

一旦引入123,124,125,134,135,145,234,235,245,345; 为2的约束,只要有效地生成,以下任何行都是可接受的解决方案:

U

理想的运行时间为O(size_of_output)。在我的用例中,N总是比L大(一个数量级或更多),因此比计算所有组合快的任何事情都会对我的构想有所改进(太慢了):

123,145;
123,245;
123,345;
124,135;
124,235;
124,345;
125,134;
125,234;
125,345;

奖励积分,提供一种确定性地从有效解决方案列表中选择任何给定解决方案的方法。例如,上面的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 示例有9个有效的解决方案。能够添加一个额外的参数1 .. 9选择返回哪个参数确实很棒。

一个简单的公式来计算结果中的组合数也会很有帮助。

1 个答案:

答案 0 :(得分:1)

这是评论中的评论,因为评论太大。

这是部分答案,可以使OP在他的问题中写出更好的示例。我不理解U参数,正如我在评论中指出的那样,我可能对他的问题有一个非常简单的解决方案,但可能不会对他有所了解。由于我无法理解所有问题,因此这里可能是他可能无法理解的答案。是的,我可以写出色的answers和出色的questions

因此,如果OP可以解释U参数以使我能够理解它,那么我可以查看我的想法是否有效,如果可以,请在此处发布答案并进行解释。但是,如果OP不能帮助我帮助他,那么答案可能很快就会消失。

第一部分

comb(0,_,[]).
comb(N,[X|T],[X|Comb]) :-
    N>0,
    N1 is N-1,
    comb(N1,T,Comb).
comb(N,[_|T],Comb) :-
    N>0,
    comb(N,T,Comb).

运行返回时

?- comb(3,[1,2,3,4,5],C).
C = [1, 2, 3] ;
C = [1, 2, 4] ;
C = [1, 2, 5] ;
C = [1, 3, 4] ;
C = [1, 3, 5] ;
C = [1, 4, 5] ;
C = [2, 3, 4] ;
C = [2, 3, 5] ;
C = [2, 4, 5] ;
C = [3, 4, 5] ;
false.