Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有效生成无重复子集的组合_Algorithm_Combinations - Fatal编程技术网

Algorithm 有效生成无重复子集的组合

Algorithm 有效生成无重复子集的组合,algorithm,combinations,Algorithm,Combinations,假设我有N(1≤ N)编号,1。。N,有效地生成尽可能多的L(1≤ L≤ N)的大小,限制组合的任何U长度子集(1≤ U≤ L)仅在结果中出现一次。通常有许多结果满足约束条件-任何结果都可以 例如,如果N为5,L为3,并且最终约束被删除(即,答案只是组合),那么我们有: 123,124,125,134,135,145,234,235,245,345; 一旦引入Uis 2约束,只要有效生成,这些行中的任何一行都是可接受的解决方案: 123,145; 123,245; 123,345; 124,1

假设我有
N
(1≤ <代码>N)编号,
1。。N
,有效地生成尽可能多的
L
(1≤ <代码>L≤
N
)的大小,限制组合的任何
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(输出的大小)。在我的用例中,N总是比L大很多(一个数量级或更多),因此任何比计算所有组合更快的东西都将是对我提出的(太慢了)的改进:

提供一种从有效解决方案列表中决定性地选择任何给定解决方案的方法的额外积分。例如,上面的
(N=5,L=3,U=2)
示例有9个有效的解决方案。能够添加一个附加参数1。。9选择返回的内容将非常好


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

这是一个放在答案中的注释,因为它对于注释来说太大了

这是让OP在问题中写出更好例子的部分答案。我不理解U参数,正如我在评论中指出的那样,我可能有一个非常简单的解决方案来解决他的问题,但他可能不理解。因为我不能理解所有的问题,这里有一个答案,他可能无法理解。是的,我可以写得非常棒

所以如果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.

您已经为123显示了2对,而有电子对:
123145;123 245; 123 345
看来您的示例中确实存在18个变体。MBo-您的三个组合都共享一对
45
。最多只能在其中一个里面。我还不明白。你的四个组合共用一对45我对你的输出有点困惑。你说你是从一个组合池中提取,但为什么你的输出被洗牌了?哎呀,我想你误读了@MBo的评论。您不能在注释中添加换行符,因此这里的分号表示句点和换行符在您的问题中的含义:这是大小L=2的三个单独组合,其中没有一个是大小U=2的共享子集。
?- 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.