Gli algoritmi di ordinamento presuppongono che tu abbia un comparatore definito. Ad esempio, se si ordinano gli interi A e B, l'operazione A > B
consente di determinare se A deve essere prima o dopo B.
Immagina di voler implementare un ordinamento, ma piuttosto che un comparatore definito e coerente, il confronto usa un'euristica di un certo senso - quindi è non una garanzia che sarà corretta. Un esempio potrebbe essere analogo a come gli oculisti identificano la tua prescrizione. Mostrano due ricette e chiedono quale è meglio. In alcuni casi, come paziente potresti non rispondere correttamente per due valori vicini. Per valori molto distanti, sarai più preciso.
Se ad esempio vuoi confrontare i valori numerici, puoi modellarlo come un comparatore personalizzato come:
public class HeuristicComparator implements Comparator {
@Override
public int compare(double val1, double val2) {
double adjustedVal1 = val1 + Math.random();
double adjustedVal2 = val2 + Math.random();
return Double.compare(adjustedVal1, adjustedVal2);
}
}
In questo esempio di base, assegno arbitrariamente alcune variazioni casuali all'operazione di confronto, dicendo efficacemente che qualsiasi doppio valore inferiore a 1.000 potrebbe potrebbe essere ordinato in modo errato. 1.5 potrebbe essere inferiore a 1,3, ma solo alcune volte.
Quali altre strategie ci sono per modellare un comportamento euristico come questo piuttosto che un comparatore? Sembra che tu possa modificare anche la logica di ordinamento (forse saltare i punti casuali, modificare un ordinamento per non "finire" tutti i tipi adiacenti)? Quali algoritmi di ordinamento possono essere facilmente modificati per abbinare questo comportamento?
O sarebbe sempre preferibile modificare il comparatore?