Рассматривая перестановку как массив чисел, мы можем закодировать ее в индекс, используя метод ниже:
// even permutation
public static int evenPermutationToIndex(byte[] permutation) {
int index = 0;
for (int i = 0; i < permutation.length - 2; i++) {
index *= permutation.length - i;
for (int j = i + 1; j < permutation.length; j++) {
if (permutation[i] > permutation[j]) {
index++;
}
}
}
return index;
}
Передавая в качестве входных данных перестановку [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
метод возвращает значение 0
.
Кроме того, мы можем получить перестановку обратно из индекса с помощью следующего метода:
//even permutation
public static byte[] indexToEvenPermutation(int index, int length) {
int sum = 0;
byte[] permutation = new byte[length];
permutation[length - 1] = 1;
permutation[length - 2] = 0;
for (int i = length - 3; i >= 0; i--) {
permutation[i] = (byte) (index % (length - i));
sum += permutation[i];
index /= length - i;
for (int j = i + 1; j < length; j++) {
if (permutation[j] >= permutation[i]) {
permutation[j]++;
}
}
}
if (sum % 2 != 0) {
byte temp = permutation[permutation.length - 1];
permutation[permutation.length - 1] = permutation[permutation.length - 2];
permutation[permutation.length - 2] = temp;
}
return permutation;
}
Затем, передав индекс 0
и длину 12
в качестве входных данных, мы получаем [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
массив перестановок.
Однако эта операция направлена на индексирование / ранжирование всех элементов от 0 до N-1. Тогда как мы можем кодировать перестановку только некоторых элементов и игнорировать другие?
Например, как получить перестановку [0, 0, 0, 0, 0, 0, 0, 8, 9, 10, 11]
, передав индекс 0
или получить [0, 0, 0, 0, 0, 11, 10, 0, 8, 9, 0, 0]
из индекса 5000
?
И, наконец, как получить тот же индекс, передав эти перестановки? Например, получите 5000
, передав перестановку [0, 0, 0, 0, 0, 11, 10, 0, 8, 9, 0, 0]
? (Фактически, метод возвращает 2468
этой перестановке.)
Примечание: я рассматриваю допустимые значения от 8 до 11 только здесь, в примерах, это следует распространить на другие числа.