É possível usar um algoritmo de classificação com uma comparação não transitiva e, se sim, por que a transitividade é listada como um requisito para classificar comparadores?
Fundo:
Um algoritmo de classificação geralmente classifica os elementos de uma lista de acordo com uma função comparadora C (x, y), com
Os requisitos para esse comparador são, tanto quanto eu os entendo:
- reflexivo:
- antissimétrico:
- transitivo:
- C (x, y) é definido para todos os x e y, e os resultados dependem apenas de x e y
(Esses requisitos sempre são listados de maneira diferente em diferentes implementações, portanto, não tenho certeza de que os atendi corretamente)
Agora estou pensando em uma função comparadora "tolerante", que aceita os números x, y como semelhantes se : C ( x , y ) = { - 1 se x < y - 1 0 se | x - y | ≤ 1 + 1 se x > y + 1
Exemplos: ambos [ 1, 2, 3, 4, 5]
e [1, 4, 3, 2, 5]
são classificados corretamente em ordem crescente, de acordo com o comparador tolerante ( se x vier antes de y na lista),
mas não é, pois C (4,2) = 1[1, 4, 2, 3, 5]
Este comparador tolerante é reflexivo e anti-simétrico, mas não transitivo.
ie C (1,2) = 0, c (2,3) = 0, mas C (1,3) = -1, violando a transitividade
No entanto, não consigo pensar em nenhum algoritmo de classificação que falhe em produzir uma saída "classificada corretamente" quando recebida esse comparador e uma lista aleatória.
Portanto, a transitividade não é necessária neste caso? E há uma versão menos rígida do transitividade que é necessário para a classificação para o trabalho?
Perguntas relacionadas:
- Por que a antisimetria é necessária para a classificação comparada? (sobre antisimetria)
- Algoritmos de classificação que aceitam um comparador aleatório (aproximadamente um C aleatório (x, y))
- OrderBy com um IComparer não transitivo (sobre o algoritmo de classificação c #, por mim)