Биективное отображение целых чисел

Английский не мой родной язык: извините за мои ошибки. Заранее благодарю за ответы.

Я изучаю C ++ и пытаюсь проверить, в какой степени два набора с одинаковым числом целых чисел — в любом порядке — являются биективными.

Пример :

int ArrayA [4] = { 0, 0, 3, 4 };
int ArrayB [4] = { 4, 0, 0, 3 };

ArrayA и ArrayB являются биективными.

Моя реализация наивна.

int i, x=0;
std::sort(std::begin(ArrayA), std::end(ArrayA));
std::sort(std::begin(ArrayB), std::end(ArrayB));
for (i=0; i<4; i++) if (ArrayA[i]!=ArrayB[i]) x++;

Если x == 0, то эти два множества биективны. Легко.

Моя проблема заключается в следующем: я хотел бы посчитать количество биекций между наборами, а не только все свойство отношений между ArrayA и ArrayB.

Пример :

int ArrayA [4] = { 0, 0, 0, 1 }
int ArrayB [4] = { 3, 1, 3, 0 }

Являются ли множества биективными в целом? Нет. Но есть 2 биографии (0 и 0, 1 и 1).

С моим кодом на выходе будет 1 биекция. Действительно, если мы отсортируем массивы, мы получим:

ArrayA = 0, 0, 0, 1;
ArrayB = 0, 1, 3, 3.

Параллельное сравнение показывает только биекцию между 0 и 0.

Тогда мой вопрос:
Знаете ли вы метод сопоставления элементов между двумя одинаковыми по размеру наборами и подсчета количества биекций, независимо от порядка целых чисел?

Ответ, данный Ивайло Странджевым, работает:

  1. Сортировать наборы,
  2. Использовать станд :: set_intersection функция,
  3. Прибыль.

2

Решение

Вам нужно посчитать количество элементов, которые содержатся в обоих наборах. Это называется пересечением множеств, и это может быть сделано с помощью стандартной функции — set_intersection, часть алгоритма заголовка. Имейте в виду, что вам все равно нужно сначала отсортировать два массива.

2

Другие решения


По вопросам рекламы [email protected]