Arrays 下一个单循环置换

Arrays 下一个单循环置换,arrays,math,permutation,combinatorics,cycle,Arrays,Math,Permutation,Combinatorics,Cycle,我想得到下一个术语,它只有一个周期。我熟悉nextPermutation函数,但这也会创建具有多个循环的置换。我不知道如何修改此函数以创建nextUnicyclePermution 长度为4的单圈排列: 2341->2413->3142->3421->4123->4312以下是生成所有单循环置换的初步想法 在循环表示法中,每个单循环置换由来自原始数组的元素的单个循环组成(例如:(1 2 3 4)或(4 1 3 2))。给定一个由n个元素组成的数组的任何单循环置换,有n种不同的方法将该置换写成一个

我想得到下一个术语,它只有一个周期。我熟悉
nextPermutation
函数,但这也会创建具有多个循环的置换。我不知道如何修改此函数以创建
nextUnicyclePermution

长度为4的单圈排列:


2341->2413->3142->3421->4123->4312

以下是生成所有单循环置换的初步想法

在循环表示法中,每个单循环置换由来自原始数组的元素的单个循环组成(例如:(1 2 3 4)或(4 1 3 2))。给定一个由n个元素组成的数组的任何单循环置换,有n种不同的方法将该置换写成一个简单的循环。例如,单循环置换(1234)可以写为(1234)、或(2341)、或(3412)、或(4123)。我们将通过强制数组的第一个元素位于循环符号的前面来选择一种书写置换的规范方法

一旦我们将该元素固定到位,我们就可以通过简单地枚举循环符号中剩余元素的所有置换来枚举所有单循环置换。例如,以下是四个元素的所有单循环置换:

  • (1 2 3 4)↠ [4,1,2,3]
  • (1 2 4 3)↠ [3,1,4,2]
  • (1 3 2 4)↠ [4,3,1,2]
  • (1 3 4 2)↠ [2,4,1,3]
  • (1 4 2 3)↠ [3,4,2,1]
  • (1 4 3 2)↠ [2,3,4,1]
一般算法如下所示:

  • 计算当前置换的循环符号
  • 旋转该循环符号,将第一个元素放入第一个插槽
  • 使用标准的下一个置换算法将循环符号的最后n-1个元素推进到下一个置换
  • 重新排列元素以匹配该循环顺序

可能有一种更快的方法来枚举它们(比如说,在排列之间做O(1)功),并且可能有一种方法可以按字典顺序生成它们。但这有望提供一个开始的算法

这些排列是否需要按字典顺序重新排列?或者有顺序吗?按字典顺序就好了。