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

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

Я изучаю 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. Используйте функцию std::set_intersection,
  3. Прибыль.

1 ответ

Решение

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

Другие вопросы по тегам