순열의 랭크를 계산하는 데 효율적인 알고리즘을 찾고, 주어진 랭크의 순열을 계산하는 데 어려움을 겪고 있습니다. 누군가 포인터를 줄 수 있습니까?순열 랭킹 알고리즘
답변
배열에 반복 요소가 있습니까? : (N X, m) = RankOfElement (X [m]
순위 :
은 에만 고유 요소가있는 경우, 다음의 재귀 길이
n-m+1
의 순열로X[m:n]
의 랭크를 계산 X [m : N]) * 요인 (N - M) + 순위 (X (m + 1) : N)
모두 Rank
및 RankOfElement
는 (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)를 + Σ {X [m : n]} - {y}의 조합 수의 over (y∈X [m : n], y < X [m]
편집
난 그냥 당신의 코멘트를 보았다. 멋진 그래픽! 원하는 것은 나무를 순회하는 것입니다.
순열의 각 위치가 나무에서 뚜렷한 레벨을 갖는 방식에 유의하십시오. 트리에서 루트에서 리프 노드까지의 모든 경로가 가능한 순열입니다.
이렇게하면 '순위'에 약간의 유연성이 있음을 의미합니다. 당신은 그것을 정의 할 수 있습니다. 트리를 통해 원하는 모든 유형의 탐색 (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
여기 http://stackoverflow.com/a/8958309/312172 그래픽을 만들어 문제를 설명하고 해결책을 제시했습니다. 오른쪽의 '관련'문제 목록을 보면 많은 중복을 발견 할 수 있습니다. –