Given an array of N elements representing the permutation atoms, is there an algorithm like that:
function getNthPermutation( $atoms, $permutation_index, $size )
where $atoms
is the array of elements, $permutation_index
is the index of the permutation and $size
is the size of the permutation.
For instance:
$atoms = array( 'A', 'B', 'C' );
// getting third permutation of 2 elements
$perm = getNthPermutation( $atoms, 3, 2 );
echo implode( ', ', $perm )."n";
Would print:
B, A
Without computing every permutation until $permutation_index ?
I heard something about factoradic permutations, but every implementation i've found gives as result a permutation with the same size of V, which is not my case.
Thanks.
As stated by RickyBobby, when considering the lexicographical order of permutations, you should use the factorial decomposition at your advantage.
From a practical point of view, this is how I see it:
(n-1)!
,(n-2)!
, and so on.i
-th quotient should be a number between0
andn-i-1
inclusive, wherei
goes from0
ton-1
.The following C code should give you an idea of how this works (
n
is the number of entries, andi
is the index of the permutation):For example,
ithPermutation(10, 3628799)
prints, as expected, the last permutation of ten elements: