Я работаю над непреложным классом Board
, который представляет собой плату N-by-N из 15 игра-головоломка (в случае N-by-N это будет игра N^2 - 1) , Я переопределены equals()
(как показано ниже) и, следовательно, hashCode()
метод для того, чтобы сохранить контракт Object, однако метод Hashcode, , который я хочу реализовать, занимает квадратичное время (он должен проверить все N^2 - 1 записей).Требование сложности hashCode
Так что мой вопрос: считается ли это плохой практикой, если hashCode не принимает постоянного времени, так как это может ухудшить производительность HashMap
/ (что я не буду использовать в любом случае)? Должен ли я выбирать что-то более простое, например, каждый раз возвращать одно и то же простое, даже если оно увеличит вероятность столкновения?
Образец 3-на-3 совета (из метода ToString())
1 2 3
4 5 6
7 0 8
Два Boards
считаются равные IFF, все записи матча.
Отрывки кода из класса Board:
public class Board {
private final int[][] tilesCopy; // tiles
private final int N; // size of the board
... code...
@Override
public boolean equals(Object y) {
if (!(y instanceof Board)) return false;
Board that = (Board) y;
if (this.size() != that.size()) return false;
for (int i = 0; i < this.size(); i++) {
for (int j = 0; j < this.size(); j++) {
if (this.tileAt(i, j) != that.tileAt(i, j)) return false;
}
}
return true;
}
@Override
public int hashCode() {
...code...
}
Зачем кешировать хэш-код, когда сам расчет находится в 'O (1)'? –
Поскольку подход, который я защищаю, является только O (1), если вычисление hashcode предыдущего состояния является «O (1)», и это происходит только в случае кэширования хэш-кода предыдущего состояния. Без кеширования вычисление будет «O (N^2)», и мы ничего бы не получили. –