给定偶数(2k)元素的列表L,我正在寻找一种算法来生成具有以下属性的2k-1子列表的列表:
例如,如果输入列表是L = [a,b,c,d],则我们有k = 2,其中有3个子列表,每个子列表包含2对。可能的解决方案看起来像[[ab,cd],[ac,bd],[ad,bc]]。如果我们忽略列表中所有元素的排序(将所有列表视为集合),事实证明这也是k = 2的唯一解决方案。
我的目标不仅仅是找到一个解决方案,而是所有可能的解决方案。随着所涉及组合的数量增长相当快,所以以巧妙的方式构造所有结果而不是生成大量候选项并从中删除不满足给定属性的元素将是很好的。这种天真的算法可能如下所示:
这个算法很容易实现,但对于更大的输入列表来说速度非常慢。那么有没有办法更有效地构建结果列表?
编辑:以下是L = [a,b,c,d,e,f]的结果,k = 3,由上述算法计算:
[[[ab,cd,ef],[ac,be,df],[ad,bf,ce],[ae,bd,cf],[af,bc,de]],
[[ab,cd,ef],[ac,bf,de],[ad,be,cf],[ae,bc,df],[af,bd,ce]],
[[ab,ce,df],[ac,bd,ef],[ad,be,cf],[ae,bf,cd],[af,bc,de]],
[[ab,ce,df],[ac,bf,de],[ad,bc,ef],[ae,bd,cf],[af,be,cd]],
[[ab,cf,de],[ac,bd,ef],[ad,bf,ce],[ae,bc,df],[af,be,cd]],
[[ab,cf,de],[ac,be,df],[ad,bc,ef],[ae,bf,cd],[af,bd,ce]]]
满足所有属性:
编辑2:根据user58697的回答,我使用循环赛锦标赛计划改进了计算算法:
该算法比第一个算法更高效。我能够计算k = 4的结果数为960,k = 5为67200.事实上,这个序列似乎没有OEIS result,这让我想知道数字是否真的正确但是,即算法是否正在生成完整的解决方案集。