ハッシュ表での衝突解決トレース

■ 解き方の方針 各addについて、まずcalcHash1の位置を計算し、使用中ならcalcHash2の位置を一度だけ確認します。配列の要素数は5、要素番号は1から始まります。 ■ 初期状態 hashArray={-1, -1, -1, -1, -1}です。-1は空きを表します。 ■ 三つの値を格納する add(3): $(3 \bmod 5)+1=4$です。4番目は空きなので3を格納し、{-1, -1, -1, 3, -1}となります。 add(18): $(18 \bmod 5)+1=4$で3と衝突します。第2候補は$((18+3) \bmod 5)+1=2$なので、2番目に18を格納し、{-1, 18, -1, 3, -1}となります。 add(11): $(11 \bmod 5)+1=2$で18と衝突します。第2候補は$((11+3) \bmod 5)+1=5$なので、5番目に11を格納します。 add calcHash1 空き? calcHash2 格納先 hashArray add(3) 4 空き − 4 {-1, -1, -1, 3, -1} add(18) 4 使用中(3) 2 2 {-1, 18, -1, 3, -1} add(11) 2 使用中(18) 5 5 {-1, 18, -1, 3, 11} ■ 最終状態 hashArray={-1, 18, -1, 3, 11} ■ 正解と誤答の見分け方 したがって、正解は エ です。 modの結果に1を加えるのは、配列の要素番号が1から始まるためです。また、衝突した値はcalcHash2で求めた別の位置に格納します。

次の記述中の    に入れる正しい答えを、解答群の中から選べ。ここで、配列の要素番号は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)

出典令和5年度 公開問題 基本情報技術者試験 科目B 問4
ア
{-1, 3, -1, 18, 11}
イ
{-1, 11, -1, 3, -1}
ウ
{-1, 11, -1, 18, -1}
エ
{-1, 18, -1, 3, 11}
オ
{-1, 18, 11, 3, -1}