私は、15パズルゲームのN行Nのボードを表す不変のBoard
クラスに取り組んでいます(N行Nの場合、N^2 - 1パズルゲームになります) 。 1エントリ - 私はequals()
(下図参照)オブジェクト契約、私はを実装したいしかしhashCodeメソッド、を、保存するために、その結果hashCode()
方法は、二次の時間がかかります(それがすべてNを確認してください^ 2をオーバーライドしています)。hashCode複雑さの必要性
私の質問は、パフォーマンスが低下する可能性があるので、hashCodeが一定の時間を取らないと悪い習慣と考えられますか?HashMap
/(これは私が使用する予定はありません)私は、たとえそれが衝突を増加させるにもかかわらず、同じプライムを毎回返すなど、より簡単なものを選ぶべきですか?
サンプル(のtoString()メソッドから採取)3×3ボード
1 2 3
4 5 6
7 0 8
Boards
つが等しいIFFとみなされている、すべてのエントリが一致します。
ボードクラスからのコードのスニペット:
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)'で、以前の状態のハッシュコードがキャッシュされている場合にのみ発生する場合、私が主張するアプローチはO(1)です。キャッシングなしでは、計算は 'O(N^2)'となり、何も得られませんでした。 –