Как проиндексировать только N элементов перестановки N позиций? - PullRequest
0 голосов
/ 03 августа 2020

Рассматривая перестановку как массив чисел, мы можем закодировать ее в индекс, используя метод ниже:

    // 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 только здесь, в примерах, это следует распространить на другие числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...