J'ai écrit une classe appelée PuzzleBoard qui représente un tableau nxn. Je vais garder plusieurs objets PuzzleBoard dans un HashSet, donc je dois écraser la méthode 'int hashCode()'.Comment hacher un tableau 2-D efficacement (à stocker dans un HashSet)?
Voici les champs de ma classe:
private int N;
private int[][] puzzle;
private int blankCellX;
private int blankCellY;
private int cost;
Quel Eclipse généré automatiquement pour moi WAS:
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;
}
Pensant que cette méthode ne prend pas en compte le contenu du 2- d tableau, je l'ai changé en:
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;
}
Cependant, le problème avec cette méthode est que cela prend trop de temps pour compléter: O (N^2) En outre; la variable 'result' est très susceptible de déborder. Maintenant, ma question est, comment puis-je écrire une méthode de hachage efficace qui ne prend pas trop de temps pour terminer. De plus; insérer ou rechercher un objet dans le HashSet devrait être efficace (temps presque constant).
Dans le pire des cas, N sera 10 et le HashSet contiendra ~ 1000 PuzzleBoards.
Pourquoi je fais tout ça? J'applique une solution pour le problème N-Puzzle en utilisant l'algorithme A *. Donc dans une certaine phase de l'algorithme, étant donné le nœud actuel (configuration de la carte), je déplace la cellule vide vers le haut, le bas, la droite ou la gauche pour générer de nouveaux nœuds enfants. Pour cette raison, les configurations de puzzle diffèrent généralement par 1 ou 2 cellules. Je stocke tous les nœuds explorés dans un HashSet.
Merci à l'avance =)
Cela vaut la peine d'être lu, aussi: http://stackoverflow.com/questions/1145217/why-should-hash-functions-use-a-prime-number-modulus –