通过旋转和反向操作进行数组置换

Array permutation through rotation and reverse operation

给定一个长度为 n 的一维数组。是否有可能以编程方式生成所有可能的排列,只需根据需要多次应用旋转和反向操作。如果是,如何(算法)?如果不是为什么? 这里的旋转可以是任何 d < n,而 reverse 意味着反转整个数组,而不仅仅是部分。 例子: 数组:1,2,3,4 反向:4,3,2,1 旋转 2:3,4,1,2

同时给出一个数组的两个排列状态A和B。是否可以仅使用任何顺序的旋转和反向操作以编程方式从状态 A 进入状态 B。如果是,如何(算法)?如果不是为什么? 例子: 答:5,3,1,2,4 B: 1,5,3,2,4

不,你不能。

假设您有任意顺序的旋转和反向操作。我们将 x 的旋转写为 ROT(x) 并反转为 REV.

给定任何这样的序列,您可以通过应用以下规则将其转换为一个等价序列,该序列最多包含一个反向序列,然后最多旋转一个序列:

规则 1:ROT(x),REV = REV,ROT(N-x)

例如,将 ROT(1), REV 应用于 1234 得到 1234 -> 2341 -> 1432 REV,ROT(3) 给出 1234 -> 4321 -> 1432 -- 同样的结果

通过应用规则 1,我们可以将所有 REV 操作移到开头。

规则 2:REV,REV = empty_sequence -- 反转相互抵消

一旦所有 REV 开始,我们就可以应用规则 2,直到最多有一个。

规则 3:ROT(x), ROT(y) = ROT(x+y % N) -- 旋转加法

还有

ROT(0) = empty_sequence

一旦所有 ROT 都在末尾,我们可以应用规则 3,直到最多有一个。

所以...任何一个操作序列都等价于一个最多有一个反向后跟最多一个非零旋转的序列。 只有2N个这样的序列,但是有N!个排列,所以任何这样的序列都无法达到 N!-2N 个排列。