置换秩算法

时间:2012-02-19 01:02:32

标签: algorithm combinatorics

我很难找到有效的算法来计算排列的排名,反之亦然(给定排名的排列)。有人可以提供一些指示吗?

2 个答案:

答案 0 :(得分:4)

你在数组中有重复的元素吗?

如果仅限于唯一元素,则以下递归会将X[m:n]的等级计算为长度n-m+1的排列:

  

秩(X,m:n)= RankOfElement(X [m],X [m:n])*因子(n - m)+秩(X,(m + 1):n)

RankRankOfElement都是从零开始的(从0开始)。

基本上,Rank(permutation) = Rank(first permutation starting with first letter of permutation) + Rank(permutation with first letter deleted),例如字符串EDCBA表示Rank(EDCBA) = Rank(EABCD) + Rank(DCBA)

通过更改第一个字词,可以将其扩展为非唯一个案:

  

秩(X,m:n)=秩(X,(m + 1):n)+Σover(y∈X[m:n],y

答案 1 :(得分:2)

修改

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

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

所以这意味着你的'等级'有一定的灵活性。你可以定义它。只需在树上进行任何类型的遍历(按顺序,预订,后序,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)

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

感兴趣