只需一个循环即可进行排名和取消排名排列
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
.
我想用给定的 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
.