Биективное отображение целых чисел
Английский не мой родной язык: извините за мои ошибки. Заранее благодарю за ответы.
Я изучаю 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.
Тогда мой вопрос: знаете ли вы метод сопоставления элементов между двумя наборами одинакового размера и подсчета количества биекций, независимо от порядка целых чисел?
Решено!
Ответ, данный Ивайло Странджевым, работает:
- Сортировать наборы,
- Используйте функцию std::set_intersection,
- Прибыль.
1 ответ
Вам нужно посчитать количество элементов, которые содержатся в обоих наборах. Это называется set intersection, и это можно сделать с помощью стандартной функции set_intersection, части алгоритма заголовка. Имейте в виду, что вам все равно нужно сначала отсортировать два массива.