Хм, а как насчет чего-то вроде бинарного дерева поиска?
Для сравнения в псевдокоде:
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;
}
, где n
, конечно, длина списков.
Я не большой профессионал java, и я действительно не знаю стандартной библиотеки, но, полагаю, вы могли бы просто написать дерево самостоятельно. Реализуйте метод getID, который попытается найти этот список или вставить его в противном случае, а также уникальный идентификатор, который можно получить, просто увеличив счетчик.
Таким образом, вы получаете идентификатор (вместо хеша), в котором нет коллизий. В худшем случае сравнение 2 списков - O(n)
, таким образом, поиск / вставка - O(n) * O(log(m))
(при условии, что дерево сбалансировано), где m
- общее количество всех списков.
Таким образом, определение идентификатора в худшем случае обходится дороже, чем хеширование, но, как уже было сказано, результат гарантированно будет уникальным.
Я мало что могу сказать о среднем, так как вы не даете цифр. На самом деле, я удивлен, что вы не хотите проводить прямое сравнение, поскольку я ожидаю, что вероятность того, что две позиции будут равны, составляет менее 1%, поэтому сравнение по списку составляет около O (1), поскольку вероятность, которая вам нужна для сравнения 5 записей действительно мало.
Кроме того, неясно, являются ли списки изменчивыми или нет, поскольку, если они являются неизменяемыми, стоимость должна быть незначительной.