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