問4 2 つのハッシュ関数で格納先を決める

基本情報​技術者試験 令和5年度 公開問題 科目B、全6問のうちの問4。

出典:令和5年度 基本情報技術者試験 公開問題 科目B 問4(プログラムは原本の画像を文字に書き起こし、字下げは 1 段を空白 2 つで表した。空欄は[  ]で表した)

次の記述中の[  ]に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。

関数 add は,引数で指定された正の整数 value を大域の整数型の配列 hashArray に格納する。格納できた場合は true を返し,格納できなかった場合は false を返す。ここで,整数 value を hashArray のどの要素に格納すべきかを,関数 calcHash1 及び calcHash2 を利用して決める。

手続 test は,関数 add を呼び出して,hashArray に正の整数を格納する。手続 test の処理が終了した直後の hashArray の内容は,[  ]である。

〔プログラム〕
大域: 整数型の配列: hashArray
 
○論理型: add(整数型: value)
整数型: i ← calcHash1(value)
if (hashArray[i] = -1)
hashArray[i] ← value
return true
else
i ← calcHash2(value)
if (hashArray[i] = -1)
hashArray[i] ← value
return true
endif
endif
return false
 
○整数型: calcHash1(整数型: value)
return (value mod hashArrayの要素数) + 1
 
○整数型: calcHash2(整数型: value)
return ((value + 3) mod hashArrayの要素数) + 1
 
○test()
hashArray ← {5個の -1}
add(3)
add(18)
add(11)
  1. ア{-1, 3, -1, 1⁠8, 1⁠1}
  2. イ{-1, 1⁠1, -1, 3, -1}
  3. ウ{-1, 1⁠1, -1, 1⁠8, -1}
  4. エ{-1, 1⁠8, -1, 3, 1⁠1}
  5. オ{-1, 1⁠8, 1⁠1, 3, -1}
答えと解説を開く

正解はエです。

hashArray は要素数 5 で、全部 -1 (空き) から始まります。add(3) では、calcHash1(3) = (3 mod 5) + 1 = 3 + 1 = 4 です。hashArray[4] は -1 なので 3 を入れます。add(1⁠8) では、calcHash1(1⁠8) = (1⁠8 mod 5) + 1 = 3 + 1 = 4 ですが、hashArray[4] には 3 が入っています。そこで calcHash2(1⁠8) = ((1⁠8 + 3) mod 5) + 1 = (2⁠1 mod 5) + 1 = 1 + 1 = 2 を使い、hashArray[2] に 1⁠8 を入れます。add(1⁠1) では、calcHash1(1⁠1) = (1⁠1 mod 5) + 1 = 1 + 1 = 2 ですが、hashArray[2] には 1⁠8 が入っています。calcHash2(1⁠1) = ((1⁠1 + 3) mod 5) + 1 = (1⁠4 mod 5) + 1 = 4 + 1 = 5 で、hashArray[5] は空きなので 1⁠1 を入れます。結果は {-1, 1⁠8, -1, 3, 1⁠1} です。正解はエです。

ほかの選択肢が違う理由

  • ア1⁠8 を calcHash1 の結果の 4 番目に入れ、3 を 2 番目に入れています。先に add(3) が 4 番目を取るので、1⁠8 のほうが calcHash2 で 2 番目に回ります。
  • イ1⁠8 が入っていません。1⁠8 は calcHash2 で 2 番目に入り、1⁠1 はその 2 番目がふさがっているので 5 番目に回ります。
  • ウ3 が入っておらず、1⁠1 と 1⁠8 の位置も違います。3 は最初に 4 番目に入ります。
  • オ1⁠1 を 3 番目に入れています。calcHash2(1⁠1) は (1⁠4 mod 5) + 1 = 5 なので、1⁠1 は 5 番目です。

仕組み

ハッシュ表は、値から計算した番号 (ハッシュ値) の場所に値を置く表です。探すときも同じ計算で場所がわかるので、端から順に探さずに済みます。

違う値が同じ番号になることを衝突と言います。この問題では、衝突したら別の計算 (calcHash2) で 2 つ目の候補を出し、そこも埋まっていれば格納をあきらめます。

この問に出る言葉