2014-09-03 9 views
1

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

Я изучаю 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.

Бок о бок comparaison показывает только взаимно однозначное соответствие между 0 и 0.

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

Решенный!

Ответ дается Ивайло Strandjev работы:

  1. Сортировать наборы,
  2. Используйте функцию std::set_intersection,
  3. Profit.
+1

Как насчет чего-то вдоль строк 'int i = 0, j = 0, count = 0; while (i

ответ

2

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

+0

Фантастический! Кажется, это решение. – 2014-09-03 14:01:41

+0

Очень элегантный, чем мое предложение. =] –

+0

После некоторых тестов: это решение. Спасибо Ивайло! – 2014-09-03 15:17:10

Смежные вопросы