Я написал класс под названием PuzzleBoard, представляющий доску nxn.Я буду хранить несколько объектов PuzzleBoard в HashSet, поэтому мне придется перезаписать метод int hashCode ().
Ниже приведены поля моего класса:
private int N;
private int[][] puzzle;
private int blankCellX;
private int blankCellY;
private int cost;
What Eclipseдля меня автоматически сгенерировано:
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + N;
result = prime * result + blankCellX;
result = prime * result + blankCellY;
result = prime * result + cost;
result = prime * result + Arrays.hashCode(puzzle);
return result;
}
Думая, что этот метод не учитывает содержимое 2-го массива, я изменил его на следующее:
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + N;
result = prime * result + blankCellX;
result = prime * result + blankCellY;
result = prime * result + cost;
for (int i = 0; i < N; ++i)
result = prime * result + Arrays.hashCode(puzzle[i]);
return result;
}
Однакопроблема этого метода в том, что для его завершения требуется слишком много времени: O (N ^ 2) Кроме того;переменная 'result', скорее всего, переполнится.
Теперь мой вопрос: как мне написать эффективный метод хеширования, выполнение которого не займет слишком много времени.Более того;вставка или поиск объекта в HashSet должен быть эффективным (почти постоянным временем).
В худшем случае N будет равно 10, а HashSet будет содержать ~ 1000 PuzzleBoards.
Зачем я все это делаю? Я реализую решение проблемы N-Puzzle с помощью алгоритма A *.Таким образом, в некоторой фазе алгоритма, учитывая текущий узел (конфигурацию платы), я перемещаю пустую ячейку вверх, вниз, вправо или влево, чтобы сгенерировать новые дочерние узлы.Из-за этого конфигурации головоломки обычно отличаются на 1 или 2 ячейки.Я храню все исследованные узлы в HashSet.
Заранее спасибо =)