Предполагая, что вы хотите произвести theMatch
из двух наборов данных, и вам нет дела до самих наборов данных, поместите один в unordered_map
(доступно в настоящее время в Boost и указано в окончательном проекте комитета для C +).+11), отображая ключ в целое число, которое увеличивается при каждом добавлении и, следовательно, отслеживает количество раз, когда ключ встречается.Затем, когда вы получаете совпадение с другим набором данных, вы push_back
получаете число совпадений, которое произошло в первый раз.
Вы можете перейти к O (n log n + m log m)сначала отсортировав векторы, либо O (n log n + m), создав std::map
одного из них.
Предостережение: это не операции сохранения порядка, и theMatch
выйдет вразные заказы с разными техниками.Мне кажется, что порядок считается произвольным.Если порядок, указанный в приведенном выше коде, необходим, я не думаю, что есть лучший алгоритм.
Редактировать:
Взять набор данных A и набор данных B типа Type.Создайте unordered_map<Type, int>
.
Просмотрите набор данных A и проверьте каждого члена, чтобы увидеть, есть ли он на карте.Если нет, добавьте элемент с int
1 на карту.Если это так, увеличьте int
.Каждая из этих операций в среднем равна O (1), поэтому этот шаг равен O (len A).
Просмотрите набор данных B и проверьте каждого члена, чтобы увидеть, находится ли он на карте.Если нет, переходите к следующему.Если это так, push_back
участник в очередь назначения.int
- это количество раз, когда это значение находится в наборе данных A, поэтому push_back
- количество раз, когда член в A дублирует данное поведение.Каждая из этих операций в среднем равна O (1), поэтому этот шаг равен O (len B).
Это среднее поведение.Если вы всегда используете худший случай, вы вернетесь с O (m * n).Я не думаю, что есть способ гарантировать O (m + n).