科目B

令和5年度 基本情報技術者試験 科目B 公開問題 問4

次の記述中の に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は 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(問題文は IPA の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)

科目Bの解き方と全問の一覧

解説に誤りを見つけたら、解説の誤りを報告してください。

答えと解説を見る

正解:エ

覚える知識

オープンアドレス法によるハッシュ衝突時の格納位置のトレース

ハッシュ関数で求めた格納位置が埋まっている(衝突した)とき、別の計算式で求めた位置に格納する方法です。

この問題で必要なこと

配列の要素数は 5 です。add(3) は 3 mod 5+1 = 4 なので [4] に 3 を入れます。add(18) は 18 mod 5+1 = 4 が埋まっているので、calcHash2 で (21 mod 5)+1 = 2 を求め [2] に 18 を入れます。add(11) は 11 mod 5+1 = 2 が埋まっているので、(14 mod 5)+1 = 5 の [5] に 11 を入れます。結果は {−1, 18, −1, 3, 11} で、正解はエです。

ひっかけ

「+1」は要素番号が 1 から始まるためのずらしで、これを忘れると格納位置が 1 つずれます。ア・イ・オは、衝突したときの処理(calcHash2 での位置の求め直し)を取り違えた場合の結果です。

この知識を科目Aの過去問で覚える レッスン「ハッシュ法と衝突の扱い」で学ぶ

同じ知識の過去問