¿Es posible usar un algoritmo de clasificación con una comparación no transitiva, y en caso afirmativo, ¿por qué se enumera la transitividad como un requisito para ordenar comparadores?
Antecedentes:
Un algoritmo de clasificación generalmente ordena los elementos de una lista de acuerdo con una función de comparación C (x, y), con
Los requisitos para este comparador son, hasta donde yo entiendo:
- reflexivo:
- antisimétrico:
- transitivo:
- C (x, y) se define para todas las x e y, y los resultados dependen solo de x e y
(Estos requisitos siempre se enumeran de manera diferente en las diferentes implementaciones, por lo que no estoy seguro de haberlos hecho bien)
Ahora me pregunto acerca de una función de comparación "tolerante", que acepta los números x, y como similares si : C ( x , y ) = { - 1 si x < y - 1 0 si | x - y | ≤ 1 + 1 si x > y + 1
Ejemplos: ambos [ 1, 2, 3, 4, 5]
y [1, 4, 3, 2, 5]
están correctamente ordenados en orden ascendente de acuerdo con el comparador tolerante ( si x aparece antes que y en la lista)
pero no lo es, ya que C (4,2) = 1[1, 4, 2, 3, 5]
Este comparador tolerante es reflexivo y antisimétrico, pero no transitivo.
es decir, C (1,2) = 0, c (2,3) = 0, pero C (1,3) = -1, violando la transitividad
Sin embargo, no puedo pensar en ningún algoritmo de clasificación que no produzca una salida "correctamente ordenada" cuando se le da este comparador y una lista aleatoria.
Por lo tanto, ¿no se requiere transitividad en este caso? ¿Y hay una versión menos estricta de transitividad que se requiere para que la clasificación funcione?
Preguntas relacionadas:
- ¿Por qué es necesaria la antisimetría para la clasificación comparativa? (sobre antisimetría)
- Algoritmos de clasificación que aceptan un comparador aleatorio (sobre un C aleatorio (x, y))
- OrderBy con un IComparer no transitivo (sobre el algoritmo de clasificación de C #, por mí)