Wie wäre es mit einer Art binärem Suchbaum?
Um den Vergleich in Pseudocode auszudrücken:
position1 > position2 :=
(position1.x > position2.x) ||
((position1.x == position2.x) && (position1.y > position2.y))
list1.x > list2.x := {
for (i in 0...n)
if (list1[i] > list2[i]) return true;
else if (list1[i] > list2[i]) return false;
return false;
}
where n
ist natürlich die Länge der Listen.
Ich bin kein großer Java-Profi und kenne mich mit der Standardbibliothek nicht wirklich aus, aber ich nehme an, Sie könnten den Baum einfach selbst schreiben. Implementieren Sie eine getID-Methode, die versucht, diese Liste zu finden oder sie anderweitig einzufügen, und dazu eine eindeutige ID, die Sie durch einfaches Inkrementieren eines Zählers erhalten können.
Auf diese Weise erhalten Sie eine ID (anstelle eines Hash), die keinerlei Kollisionen aufweist. Im schlimmsten Fall ist der Vergleich von 2 Listen O(n)
Somit ist eine Suche/Einfügung O(n) * O(log(m))
(unter der Annahme, dass der Baum ausgeglichen ist), wobei m
ist die Gesamtzahl aller Listen.
Die Ermittlung einer ID ist also im schlimmsten Fall teurer als Hashing, aber wie gesagt, das Ergebnis ist garantiert eindeutig.
Über den Durchschnitt kann ich wenig sagen, da Sie keine Zahlen nennen. Eigentlich bin ich überrascht, dass Sie keinen direkten Vergleich machen wollen, da ich davon ausgehe, dass die Wahrscheinlichkeit, dass 2 Positionen gleich sind, weniger als 1 % beträgt, so dass ein Listenvergleich etwa O(1) ist, da die Wahrscheinlichkeit, dass Sie 5 Einträge vergleichen müssen, wirklich gering ist.
Es ist auch nicht klar, ob die Listen veränderbar sind oder nicht, denn wenn sie unveränderbar sind, sollten die Kosten kaum ins Gewicht fallen.