+ 1 для решений SQL / Db упрощает работу - позволит вам сосредоточиться на реальной задаче.
Но только для академических целей я хотел бы добавить свои 2 цента.
-1 для хеш-таблиц. (Пока не могу проголосовать) Поскольку они реализованы с использованием сегментов, во многих практических реализациях стоимость хранения может быть огромной. Кроме того, я согласен с Эриком Дж. Вероятность столкновения подорвет преимущества эффективности времени.
Ли, создание дерева или DAWG займет место, а также некоторое дополнительное время (задержка инициализации). Если это не проблема (это будет иметь место, когда вам может понадобиться выполнить операции поиска с набором строк в будущем, и у вас будет достаточно памяти), попытки могут быть хорошим выбором.
Пространство будет проблемой с сортировкой Radix или подобными реализациями (как упомянуто KirarinSnow), потому что набор данных огромен.
Ниже приведено мое решение для однократного подсчета дубликатов с ограничениями на то, сколько места можно использовать.
Если у нас есть хранилище для хранения 1 миллиарда элементов в моей памяти, мы можем отсортировать их на месте к сортировке кучи за время Θ (n log n), а затем просто обойти собираем один раз за O (n) время и делаем это:
if (a[i] == a[i+1])
dupCount++;
Если у нас не так много доступной памяти, мы можем разделить входной файл на диске на более мелкие файлы (пока размер не станет достаточно маленьким для хранения коллекции в памяти); затем отсортируйте каждый такой маленький файл, используя описанную выше технику; затем объединить их вместе. Это требует много проходов в основном входном файле.
Я хотел бы держаться подальше от быстрой сортировки , потому что набор данных огромен. Если бы я мог втиснуть немного памяти для второго случая, я бы лучше использовал его, чтобы уменьшить количество проходов, а не тратить его на сортировку слиянием / быструю сортировку (на самом деле, это сильно зависит от типа ввода, который у нас есть) ).
Редактировать: Решения SQl / DB хороши только тогда, когда вам нужно хранить эти данные в течение длительного времени.