Algorithm 排列秩算法

Algorithm 排列秩算法,algorithm,combinatorics,Algorithm,Combinatorics,我正在努力寻找计算置换秩的有效算法,反之亦然(给定秩的置换)。有人能给点建议吗?编辑 我刚看到你的评论。漂亮的图形!你想要的是一个树遍历 注意,排列中的每个位置在树中都有不同的级别?树中从根到叶节点的每条路径都是一种可能的排列 这意味着你的“等级”有一定的灵活性。你可以定义它。只需在树上进行任意类型的遍历(按序、按序、按序、按序、按序、按DFS、按BFS),就可以获得在直接遍历每个叶节点时递增的叶节点编号 因此,只需选择排列的遍历和排序,使其成为您觉得最自然或最方便的应用程序。如果无法选择,请询

我正在努力寻找计算置换秩的有效算法,反之亦然(给定秩的置换)。有人能给点建议吗?

编辑

我刚看到你的评论。漂亮的图形!你想要的是一个树遍历

注意,排列中的每个位置在树中都有不同的级别?树中从根到叶节点的每条路径都是一种可能的排列

这意味着你的“等级”有一定的灵活性。你可以定义它。只需在树上进行任意类型的遍历(按序、按序、按序、按序、按序、按DFS、按BFS),就可以获得在直接遍历每个叶节点时递增的叶节点编号

因此,只需选择排列的遍历和排序,使其成为您觉得最自然或最方便的应用程序。如果无法选择,请询问/dev/random应该使用哪种遍历

结束编辑

首先,它必须被认为是一个基本转换。每个排列都在一个点上(它的秩)。想想二进制。计算n个字符上的2个字母排列的有效算法是什么?只需分配秩,就可以进行排列

同样的道理也适用于其他大小的字母表。显然,如果你的位置有不同大小的字母表,事情会更复杂,但你仍然可以做组合运算:

total possible = pi(|a|_i) for all i in positions

|a|_i alphabet size at position i

and assuming all |a|_i are equal to b you have

rank of permutation = sigma(b**i * a_i)

a_i is actual alphabet character chosen at position i.

So over the 5 alphabet (ABCDE) 

The rank of AAAAA = 0 (or 1)
The rank of EEEED = 5**6 - 2
然后,要从秩中获得置换,只需使用一个基数公式:我似乎记得:

a_i = (P % b**(i+1) - P & (b**i))/(b**i)

如果你从这个组合和基数的角度考虑,你不会出错,即使是在更复杂的情况下。只需取你想要的任何等级,并将其转换为适合你的字母表的基数。您可能对

阵列中是否有重复元素感兴趣

如果只有唯一元素,则以下递归将
X[m:n]
的秩计算为长度的排列
n-m+1

秩(X,m:n)=秩(X[m],X[m:n])*阶乘(n-m)+秩(X,(m+1):n)

Rank
rankoffelement
都是从零开始的(从0开始)

基本上,
Rank(排列)=Rank(第一个排列从排列的第一个字母开始)+Rank(删除第一个字母的排列)
,例如,对于字符串
EDCBA
,这意味着
Rank(EDCBA)=Rank(EABCD)+Rank(DCBA)

通过更改第一项,这可以扩展到非唯一的情况:

秩(X,m:n)=秩(X,(m+1):n+∑ 超过(y)∈ {X[m:n]}-{y}的组合数的X[m:n],y 在这里,我画了一幅图,说明了问题,并以一种方式给出了解决方案。如果您查看右侧的
相关问题列表,您会发现许多重复问题。