找到给定列表的所有2个组合的某些安排

时间:2017-02-08 16:07:04

标签: algorithm combinations oeis

给定偶数(2k)元素的列表L,我正在寻找一种算法来生成具有以下属性的2k-1子列表的列表:

  1. 每个子列表包含来自L的元素的恰好k个2组合(顺序无关紧要的对),
  2. 每个子列表仅包含L中的每个元素,并且
  3. 所有子列表中所有元素的并集恰好是L中元素的所有可能的2种组合的集合。
  4. 例如,如果输入列表是L = [a,b,c,d],则我们有k = 2,其中有3个子列表,每个子列表包含2对。可能的解决方案看起来像[[ab,cd],[ac,bd],[ad,bc]]。如果我们忽略列表中所有元素的排序(将所有列表视为集合),事实证明这也是k = 2的唯一解决方案。

    我的目标不仅仅是找到一个解决方案,而是所有可能的解决方案。随着所涉及组合的数量增长相当快,所以以巧妙的方式构造所有结果而不是生成大量候选项并从中删除不满足给定属性的元素将是很好的。这种天真的算法可能如下所示:

    1. 找到L。
    2. 的所有2种组合的集合C.
    3. 找到C的所有k组合的集合D.
    4. 从D中选择所有联合等于L的集合,调用新集合D'。
    5. 找到D'的所有(2k-1)组合的集合E.
    6. 从E中选择所有集合,即union为集合C,并将新集合作为最终输出。
    7. 这个算法很容易实现,但对于更大的输入列表来说速度非常慢。那么有没有办法更有效地构建结果列表?

      编辑:以下是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]]]
      

      满足所有属性:

      1. 每个子列表都有k = 3 2个组合,
      2. 每个子列表只包含一次元素,
      3. 一个解决方案的所有2k-1 = 5个子列表的并集恰好是L的所有可能的2个组合的集合。
      4. 编辑2:根据user58697的回答,我使用循环赛锦标赛计划改进了计算算法:

        1. 设S为结果集,以空集开头,P为L的所有排列的集合。
        2. 重复以下操作,直到P为空:
          • 从P
          • 中选择任意排列
          • 对此排列执行完整的RRT调度。在每一轮中,L元素的排列形成了L的排列。从P中删除所有这些2k排列。
          • 将生成的计划添加到S。
        3. 如果其子列表的并集具有重复元素,则从S中删除所有列表(即,不添加到L的所有2个组合)。
        4. 该算法比第一个算法更高效。我能够计算k = 4的结果数为960,k = 5为67200.事实上,这个序列似乎没有OEIS result,这让我想知道数字是否真的正确但是,即算法是否正在生成完整的解决方案集。

1 个答案:

答案 0 :(得分:2)

这是一场循环赛的赛程安排:

  1. 一对是匹配,
  2. 列表是一轮(每个团队与其他团队一起玩)
  3. 一组列表是整个锦标赛(每个团队只参加一次团队)。
  4. 看看here