生成对的所有排列,排除单个元素的排列

时间:2014-02-18 09:36:45

标签: c algorithm permutation combinatorics

我想生成有序对(a,b)的所有排列,其中a!= b和a,b是集合S的元素(假设S:= {1..k}),但不包括S的各个要素的排列。

例如,设置k = 2,可能的有序对是(1,2),(2,1)给出2个可能的序列:

  • (1,2),(2,1)
  • (2,1),(1,2)

但在{1-> 2,2-> 1}的排列映射下实际上是重复的。

对于k = 3,将有6个可能的有序对,给出6!序列(包括重复)。但是3! = k个可能的排列,所需的唯一序列数是5!,并且只通过采用以该对开始的序列(1,2)很容易生成。

在一般情况下,会有k *(k-1)对,给出[k *(k-1)]!序列(包括重复),并且会有k!排列,所以我最终应该[k *(k-1)]! / k!序列。

我只打算使用小的k值,但我想知道是否有任何好的方法来生成这些序列。我很确定这是过滤掉独特序列[允许重复元素]的特定情况,这些序列受到这些序列中可能元素的排列的影响,但也许我正在寻找的东西比粗体更容易 - 强制生成所有可能的序列,然后过滤。

2 个答案:

答案 0 :(得分:3)

看看回溯算法:

http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680Ch19.html

生成排列是一个NPC问题,因此所有解决方案都具有指数复杂性。

答案 1 :(得分:1)

我认为你可以扩展你的方法,只生成以(1,2)开头的序列,只生成序列,如果你依次考虑每个数字:

  1. 数字匹配前一个数字
  2. 数字是下一个看不见的数字
  3. 因此,允许使用类似(1,2)(2,1)和(1,2)(3,4)的序列,但不允许(1,2)(4,5),因为4违反了规则(3是现阶段下一个看不见的数字)。

    鉴于此,您可以通过依次选择每一对来递归地生成所有组合,其中每对必须都是新对,并且满足规则。

    e.g。对于k = 3

    (1,2) Only option for level 1
    (1,2) can be followed by (2,1) or (1,3) or (2,3) or (3,1) or (3,2)
    (1,2)(2,1) can be followed by (3,1) or (3,2) or (1,3) or (2,3)
    (1,2)(2,1)(3,1) can be followed by...