Как насчет:
случайным образом выберите небольшое подмножество из K элементов и найдите дубликаты (например, первые 4, первые 8 и т. д.). Если K == 4, то вероятность не получить как минимум 2 дубликата составляет 1/8. если K == 8, то оно становится менее 1%. Если вы не нашли дубликатов, повторите процедуру, пока не сделаете. (Предполагая, что другие элементы распределены более случайным образом, это будет работать очень плохо, скажем, с 49% массива = "A", 51% массива = "B").
например:
findDuplicateCandidate:
select a fixed size subset.
return the most common element in that subset
if there is no element with more than 1 occurrence repeat.
if there is more than 1 element with more than 1 occurrence call findDuplicate and choose the element the 2 calls have in common
Это операция постоянного порядка (если набор данных не плохой), поэтому выполните линейное сканирование массива, чтобы (N) проверить.