問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
データのハッシュ値を添字として用い、データを表に格納するデータ構造をハッシュテーブルと呼びます。このデータ構造には、データの挿入や検索が O(1) でおこなえるという利点があります。
ハッシュテーブルの最もシンプルな実装は、以下のようなものです。
・ 前準備
ハッシュ関数と、配列を用意する (ハッシュ関数の出力の範囲が、配列の添字の範囲に収まるように)・ データの挿入
データのハッシュ値を計算し、その値を添字として配列にデータを格納する・ データの検索
データのハッシュ値を計算し、その添字の位置にデータがあるかどうかを調べる
・ オープンアドレス法
衝突が解消されるまで、ハッシュ値を再計算する・ チェイン法
配列の要素をデータそのものではなくデータのリストとする。衝突した複数のデータを同じ場所に格納する
オープンアドレス法
を採用し、ハッシュテーブルを実装してみましょう。H(x) = x % 10
を用いて、この n 個の整数をハッシュテーブルに格納してください。ハッシュテーブルは要素数 10 の配列とし、配列の各要素にはデータそのものを格納することとします。なお、各要素の初期値は -1 とします。ハッシュ値が衝突した場合は、空いている添字が見つかるまで H(x) ← (H(x) + 1) % 10
による再計算をおこなってください。最後に、ハッシュテーブルの状態を出力してください。H(x) ← (H(x) + 1) % 10
を用いてハッシュ値を再計算します。すると、(8 + 1) % 10 = 9 となります。添字 9 の位置にはまだいずれのデータも格納されていないので、ここにデータ 38 を格納します。H(x) ← (H(x) + 1) % 10
を用いて再計算すると 8 となりますが、添字 8 の位置にもすでにデータ 188 が格納されています。そこでさらに再計算すると 9 となりますが、この位置にもデータ 38 が格納されています。さらに再計算すると 0 となり、添字 0 の位置にはまだいずれのデータも格納されていないためここにデータ 77777 を格納します。77777, -1, -1, -1, -1, -1, -1, 17, 188, 38
となります。出力の際は、先頭から 1 要素ずつ改行区切りで、計 10 行で以下のように出力してください。77777
-1
-1
-1
-1
-1
-1
17
188
38
n
x_1
x_2
...
x_n
全 n データを格納したあとのハッシュテーブルの状態を、10行に渡って出力してください。i 行目には、ハッシュテーブルの添字 i の位置に格納されているデータ (格納されていない場合は -1) を出力してください。
また、末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 入力はすべて整数
・ 1 ≦ n ≦ 10
・ 0 ≦ x_i ≦ 1,000,000 (1 ≦ i ≦ n)
4
17
188
38
77777
77777
-1
-1
-1
-1
-1
-1
17
188
38