2012-02-19 3 views
4

순열의 랭크를 계산하는 데 효율적인 알고리즘을 찾고, 주어진 랭크의 순열을 계산하는 데 어려움을 겪고 있습니다. 누군가 포인터를 줄 수 있습니까?순열 랭킹 알고리즘

+0

여기 http://stackoverflow.com/a/8958309/312172 그래픽을 만들어 문제를 설명하고 해결책을 제시했습니다. 오른쪽의 '관련'문제 목록을 보면 많은 중복을 발견 할 수 있습니다. –

답변

4

배열에 반복 요소가 있습니까? : (N X, m) = RankOfElement (X [m]

순위 :

에만 고유 요소가있는 경우, 다음의 재귀 길이 n-m+1의 순열로 X[m:n]의 랭크를 계산 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), 문자열 EDCBARank(EDCBA) = Rank(EABCD) + Rank(DCBA)을 의미합니다.

이 제 용어 변경 비 고유가지 경우에 확장 될 수

:

순위 (X, m : N) = 순위 (X (m + 1) : N)를 + Σ {X [m : n]} - {y}의 조합 수의 over (y∈X [m : n], y < X [m]

2

편집

난 그냥 당신의 코멘트를 보았다. 멋진 그래픽! 원하는 것은 나무를 순회하는 것입니다.

순열의 각 위치가 나무에서 뚜렷한 레벨을 갖는 방식에 유의하십시오. 트리에서 루트에서 리프 노드까지의 모든 경로가 가능한 순열입니다.

이렇게하면 '순위'에 약간의 유연성이 있음을 의미합니다. 당신은 그것을 정의 할 수 있습니다. 트리를 통해 원하는 모든 유형의 탐색 (inorder, preorder, postorder, 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