只需一个循环即可进行排名和取消排名排列

Rank and unrank permutations with just one cycle

我想用给定的 len 按字典顺序对一个循环的排列进行排序和取消排序。

一个循环的排列就是你可以在这个循环中访问每个元素。

p:= (2,3,1)是一个循环的排列。排名 1.

p:= (3,1,2) 也有 1 个循环,但排名为 2,因为排列在字典序上越大,所以排名越高。

p:= (1,2,3)是一个有3个周期的排列。 (1),(2),(3)

如何有效地按字典序排列(排列一个循环进行排列)和取消排列(排列+ len 排列一个循环)?我不知道如何存档。

我发现了一个排名解决方案。我们知道长度为 n 的排列有 n-1!一个周期的排列。由于这些知识,我们可以得出以下解决方案。

排名:例子2341

我们开始计算第 1 位的排名 (n-1[position])! as tempvalue。然后我们计算 2 的索引为 0,因为 1 正在通过它创建循环 (1)。为了完成第一个位置的计算,我们需要将元素的 index 乘以 tempvalue,这导致 0 为 temprank_0。 现在我们对剩余位置继续此步骤以添加 temprank_0+temprank_1+temprank_2+temprank_4 = 0

未排序:4 排列 len 4:

我们通过 (n-2[postion+1])! 来划分等级,它导致 2 这是 1234 的索引,它不会创建一个循环所以排列的第一个位置是 4 .然后我们从 4 中减去 2 times (n-2)!。 我们继续这个两次。所以我们有 412。所以最后我们只添加剩余的值 3 最后我们得到排列 4123 .