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