演習課題「ハッシュ値の衝突の確認」
整数nが与えられ、さらにn個の整数 x_1からx_n が与えられます。
コードエリアでは、ハッシュテーブルにx_1, x_2, ..., x_nのデータが格納するコードが記述されています。
H(y) = H(z)となるように、変数zに値を代入して、ハッシュ値を衝突させてください。
期待する出力値
999
999
#07:ハッシュ値の衝突への対策
このチャプターでは、ハッシュ値の衝突への対策について学習します。
・値を格納するときにハッシュ値が衝突
・データを上書きしてしまう
衝突しないためには
・ハッシュ値が衝突しないようにハッシュ関数を設計したい
・必ずハッシュ値の衝突を回避できるハッシュ関数を作れるとは限らない
対策
・衝突しても、データを削除しないように工夫する
オープンアドレス法
・衝突が解消されるまで、ハッシュ値を再計算
チェイン法
・配列の要素をデータそのものではなくデータのリストにする
・衝突した複数のデータを同じ場所に格納
import java.util.*;
public class Main {
// ハッシュ関数
static int H(int x) {
return x % 10;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// ハッシュテーブルの初期化
var table = new ArrayList<Integer>();
for(int i = 0; i < 10; i++){
table.add(-1);
}
int n = sc.nextInt();
for(int i = 0; i < n; i++){
int x = sc.nextInt();
int hash = H(x);
// データの追加
table.set(hash, x);
}
// データの検索
int y = 777;
System.out.println(table.get(H(y)));
int z = 17;
System.out.println(table.get(H(z)));
}
}