È possibile utilizzare un algoritmo di ordinamento con un confronto non transitivo e, in caso affermativo, perché la transitività è elencata come requisito per i comparatori di ordinamento?
Sfondo:
Un algoritmo di ordinamento in genere ordina gli elementi di un elenco secondo una funzione di confronto C (x, y), con
I requisiti per questo comparatore sono, per quanto li capisco:
- riflessivo:
- antisimmetrico:
- transitivo:
- C (x, y) è definito per tutti x e y, e i risultati dipendono solo da xey
(Questi requisiti sono sempre elencati in modo diverso in diverse implementazioni, quindi non sono sicuro di averli fatti bene)
Ora mi chiedo una funzione di confronto "tollerante", che accetta i numeri x, y come simili se :
Esempi: entrambi [ 1, 2, 3, 4, 5]
e [1, 4, 3, 2, 5]
sono correttamente ordinati in ordine crescente secondo il comparatore tollerante ( se x viene prima di y nell'elenco)
ma non lo è, poiché C (4,2) = 1[1, 4, 2, 3, 5]
Questo comparatore tollerante è riflessivo e antisimmetrico, ma non transitivo.
cioè C (1,2) = 0, c (2,3) = 0, ma C (1,3) = -1, violando la transitività
Eppure non riesco a pensare a nessun algoritmo di ordinamento che non riuscirebbe a produrre un output "correttamente ordinato" se fornito questo comparatore e un elenco casuale.
La transitività non è quindi richiesta in questo caso? E c'è una versione meno rigida di transitività, che è necessario per la cernita al lavoro?
Domande correlate:
- Perché l'antisimmetria è necessaria per l'ordinamento comparativo? (sull'antisimmetria)
- Algoritmi di ordinamento che accettano un comparatore casuale (su una C casuale (x, y))
- Ordina con un IComparer non transitivo (sull'algoritmo c # sort, da me)