Est-il possible d'utiliser un algorithme de tri avec une comparaison non transitive, et si oui, pourquoi la transitivité est-elle répertoriée comme exigence pour le tri des comparateurs?
Contexte:
Un algorithme de tri trie généralement les éléments d'une liste selon une fonction de comparaison C (x, y), avec
Les exigences pour ce comparateur sont, pour autant que je les comprenne:
- réflexif:
- antisymétrique:
- transitive:
- C (x, y) est défini pour tous les x et y, et les résultats dépendent uniquement de x et y
(Ces exigences sont toujours répertoriées différemment selon les différentes implémentations, donc je ne suis pas sûr de les avoir bien comprises)
Maintenant, je me pose des questions sur une fonction de comparaison "tolérante", qui accepte les nombres x, y comme similaires si : C ( x , y ) = { - 1 si x < y - 1 0 si
Exemples: les deux [ 1, 2, 3, 4, 5]
et [1, 4, 3, 2, 5]
sont correctement triés par ordre croissant selon le comparateur tolérant ( si x vient avant y dans la liste)
mais [1, 4, 2, 3, 5]
ne l'est pas, puisque C (4,2) = 1
Ce comparateur tolérant est réflexif et antisymétrique, mais pas transitif.
c'est-à-dire C (1,2) = 0, c (2,3) = 0, mais C (1,3) = -1, violant la transitivité
Pourtant, je ne peux penser à aucun algorithme de tri qui ne parviendrait pas à produire une sortie "correctement triée" si l'on donnait ce comparateur et une liste aléatoire.
La transitivité n'est-elle donc pas requise dans ce cas? Et est - il une version moins stricte de transitivité qui est nécessaire pour le tri au travail?
Questions connexes:
- Pourquoi l'antisymétrie est-elle nécessaire pour le tri par comparaison? (sur l'antisymétrie)
- Algorithmes de tri qui acceptent un comparateur aléatoire (environ un C aléatoire (x, y))
- OrderBy avec un IComparer non transitif (à propos de l'algorithme de tri c #, par moi)