Si vos éléments sont d'une manière ou d'une autre comparables (le fait que l'ordre ait une signification réelle est indifférent -- il faut juste qu'il soit cohérent avec votre définition de l'égalité), la solution la plus rapide pour supprimer les doublons est de trier la liste ( 0(n log(n))) puis de faire un seul passage et de rechercher répétées éléments (c'est-à-dire des éléments égaux qui se suivent) (c'est O(n)).
La complexité globale sera O(n log(n)), ce qui est à peu près la même que ce que vous obtiendriez avec un ensemble (n fois long(n)), mais avec une constante beaucoup plus petite. Ceci est dû au fait que la constante de sort/dedup résulte du coût de la comparaison des éléments, alors que le coût de l'ensemble résulte très probablement d'un calcul de hachage, plus une (éventuellement plusieurs) comparaisons de hachage. Si vous utilisez une implémentation de Set basée sur le hachage, car une implémentation basée sur l'arbre vous donnera un coût de O( n log²(n) ), ce qui est encore pire.
Cependant, d'après ce que j'ai compris, vous n'avez pas besoin de supprimer duplicata, mais se contentent de tester leur existence. Vous devriez donc coder manuellement un algorithme de tri par fusion ou par tas sur votre tableau, qui sortirait simplement en retournant true (i.e. "there is a dup") si votre comparateur retourne 0, et sinon terminerait le tri, et traverserait le tableau trié en testant les répétitions. Dans un tri par fusion ou par tas, en effet, lorsque le tri est terminé, vous aurez comparé chaque paire de doublons, à moins que les deux éléments ne soient déjà à leur position finale (ce qui est peu probable). Ainsi, un algorithme de tri modifié devrait permettre une amélioration considérable des performances (il faudrait que je le prouve, mais je suppose que l'algorithme modifié devrait être dans la gamme O(log(n)) sur des données uniformément aléatoires).