Algorithm 元素数为偶数的集的划分

Algorithm 元素数为偶数的集的划分,algorithm,discrete-mathematics,Algorithm,Discrete Mathematics,有没有什么有效的方法可以将集合{1,…,2*n}的所有划分列成n对 最简单的方法是列出所有排列,然后排列(a1,a2,…,a8)表示除法{{a1,a2},…,{a7,a8}。在这种情况下,有2^n*n每个分区的排列。这是O((2n)!) 我能找到更有效的方法吗?这是我的纸笔算法: f(set,result): if the set is empty: return result otherwise: pair one item from the set with

有没有什么有效的方法可以将集合
{1,…,2*n}
的所有划分列成
n

最简单的方法是列出所有排列,然后排列
(a1,a2,…,a8)
表示除法
{{a1,a2},…,{a7,a8}
。在这种情况下,有
2^n*n每个分区的排列。这是
O((2n)!)


我能找到更有效的方法吗?

这是我的纸笔算法:

f(set,result):
  if the set is empty:
    return result
  otherwise:
    pair one item from the set with
    each of the remaining items,
    calling f again with the pair added to
    the result and out of the set

123456
12 34 56
   35 46
   36 45
13 24 56
   25 46
   26 45
14 23 56
   25 36
   26 35
...

列举这些对很容易。如果您允许在“提取”一对后按顺序将索引重新标记为最低可用值的约定,则会在kC2项之间为k in(2*n到2步骤2)获得一系列平坦(而不是树)的选择。然后,您可以做出选择,从2*n下降到2,并根据这些选择“读取”链中的原始索引。折衷是O(n)而不是O(1)选择时间。如果没有人能比得上我,我可能会在稍后编写一些代码来获得一个真正的“答案”…谢谢你的答案,但不幸的是,我不理解你的算法。如果您能编写一些伪代码,我将不胜感激。顺序重要吗?如果你列出所有的排列,你会得到大量的
{{x,y}…}
{y,x}…}
分开列出,这就是你想要的吗?对内的顺序不重要,对的顺序也不重要。我想找到一些方法把{1,…,2*n}的所有划分列成两个元素子集。例如1,2-3,4-5,6-7,8是一个师2,1-3,4-5,6-7,8是同一个师3,4-1,2-5,6-7,8也是同一个师。集合{1,…2*n}的所有划分为“对”的数目是(2n-1)*(2n-3)*(2n-5)**5*3*1我想以一种有效的方式列出所有这些问题。看看我的答案: