我想生成有序对(a,b)的所有排列,其中a!= b和a,b是集合S的元素(假设S:= {1..k}),但不包括S的各个要素的排列。
例如,设置k = 2,可能的有序对是(1,2),(2,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值,但我想知道是否有任何好的方法来生成这些序列。我很确定这是过滤掉独特序列[允许重复元素]的特定情况,这些序列受到这些序列中可能元素的排列的影响,但也许我正在寻找的东西比粗体更容易 - 强制生成所有可能的序列,然后过滤。
答案 0 :(得分:3)
看看回溯算法:
http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680Ch19.html
生成排列是一个NPC问题,因此所有解决方案都具有指数复杂性。
答案 1 :(得分:1)
我认为你可以扩展你的方法,只生成以(1,2)开头的序列,只生成序列,如果你依次考虑每个数字:
因此,允许使用类似(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...