Если ваши элементы каким-то образом сопоставимы (тот факт, что порядок имеет какое-либо реальное значение, безразличен - он просто должен соответствовать вашему определению равенства), самое быстрое решение для удаления дубликатов будет отсортировать список (0 (n log ( n))) затем сделать один проход и искать повторяющиеся элементы (то есть равные элементы, следующие друг за другом) (это O (n)).
Общая сложность будет O (n log (n)), что примерно такое же, как у Set (n times long (n)), но с гораздо меньшей константой. Это связано с тем, что константа в сортировке / дедупликации является результатом стоимости сравнения элементов, тогда как стоимость из набора, скорее всего, будет результатом вычисления хеша плюс одно (возможно, несколько) сравнений хешей. Если вы используете реализацию Set на основе хэшей, то есть потому, что Tree based даст вам O (n log² (n)), что еще хуже.
Однако, насколько я понимаю, вам не нужно удалять дубликаты, а просто проверять их наличие. Таким образом, вы должны вручную запрограммировать алгоритм сортировки слияния или кучи в своем массиве, который просто завершает работу с возвратом истины (т. Е. «Есть дублирование»), если ваш компаратор возвращает 0, и в противном случае завершает сортировку и проходит тестирование отсортированного массива на наличие повторов. . Действительно, при сортировке слиянием или кучей, когда сортировка завершена, вы будете сравнивать каждую повторяющуюся пару, если оба элемента уже не были в своих конечных положениях (что маловероятно). Таким образом, измененный алгоритм сортировки должен дать огромное улучшение производительности (мне нужно было бы это доказать, но я думаю, что измененный алгоритм должен быть в O (log (n)) для равномерно случайных данных)