Как найти первый дубликат элемента в векторе — C ?

#c #vector

#c #вектор

Вопрос:

У меня есть вектор с разными значениями, и некоторые из них могут отображаться дважды. (Только дважды.)
Как я могу найти ПЕРВЫЙ дубликат элемента?

Например: [a][b][b][a]
Тогда мне понадобится ‘b’.

(Извините за вопрос новичка.)

Комментарии:

1. если вы знаете значения элементов, скажем, их алфавит, у вас может быть вектор<int> vec(26); и для каждого значения вы выполняете vec[c-‘a’] ; и если оно не равно нулю, то значение появилось дважды. Это быстрее, чем при использовании std::set . Но тогда вы должны быть уверены, каковы значения.

Ответ №1:

Если вы ищете смежные дубликаты, вы можете просто использовать std::adjacent_find .

Если дубликаты не обязательно соседние, то вы могли бы сначала std::sort создать вектор, а затем использовать std::adjacent_find для результата. (См. Комментарий @aix ниже)

В качестве альтернативы, вы могли бы поместить каждый элемент в std::set и по ходу выполнения искать столкновения.

Комментарии:

1. ( 1) Метод сортировки не обязательно будет находить первый дублированный элемент, как того требует вопрос.

Ответ №2:

На этот вопрос есть много ответов. Чтобы найти лучший элемент, необходимо знать контекст вашего сценария использования. Например, нормально ли, что дубликаты существуют в первую очередь? Что вы собираетесь делать с результатом поиска дубликатов? Можем ли мы всегда использовать параллельную структуру с вектором? И многое другое…

Итак, один из многих способов — повторить элементы и insert их в std::set<> . Посмотрите на second параметр возвращаемого std::pair<> , чтобы узнать, существовало ли значение в наборе или нет, тогда вы получите первый дубликат и сможете отказаться от set добавления.

Ответ №3:

Если вы не хотите использовать дополнительное хранилище, есть примерно два решения. Первый — это перебор: для каждого элемента i проверьте, равен ли он элементам 0..i-1. Это O(N*N) (очевидный наихудший случай: последние два элемента являются первыми дубликатами).

Второе решение — ускорить поиск, сохранив диапазон 0 ..i. отсортированным. Вы обнаружите дубликаты тривиально во время сортировки. Пузырьковая сортировка эффективна, потому что диапазон 0..i-1 уже был отсортирован на предыдущей итерации. Все еще O(N*N) худший случай, но O(N) если диапазон был отсортирован раньше.