基本情報技術者試験 令和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)
選択肢を押すと答え合わせができます。
正解と解説を見る
【正解】エ
hashArrayの要素数は5で、初期状態は全要素が-1です。-1は空き要素を表します。
add(3)では、第1ハッシュ値が(3 mod 5)+1=4となります。要素4は空いているので3を格納し、配列は{-1, -1, -1, 3, -1}になります。
add(18)では、第1ハッシュ値が(18 mod 5)+1=4となりますが、要素4には3があります。そこで第2ハッシュ値を計算すると、((18+3)mod 5)+1=2です。要素2は空いているので18を格納します。
add(11)では、第1ハッシュ値が(11 mod 5)+1=2となり、要素2は使用済みです。第2ハッシュ値は、((11+3)mod 5)+1=5なので、要素5に11を格納します。最終結果は{-1, 18, -1, 3, 11}です。
アは誤りです。3の第1ハッシュ値は2ではなく4であり、18は衝突後に要素2へ格納されます。
イは誤りです。18が配列から欠けており、11の衝突後の格納先も要素2ではなく要素5です。
ウは誤りです。使用済みの要素4を18で上書きする処理はありません。衝突時は第2ハッシュ値を使います。
オは誤りです。11の格納先を要素3としていますが、第2ハッシュ値の計算結果は5です。
【ポイント】 異なる値が同じ添字になることをハッシュの衝突といいます。 このプログラムは衝突時に別のハッシュ関数を一度だけ試す方式です。 modの結果に1を加えるのは、要素番号が1から始まるためです。
【参考】擬似言語の記述形式(基本情報技術者試験用)
擬似言語を使用した問題では、各問題文中に注記がない限り、次の記述形式が適用されているものとする。
〔擬似言語の記述形式〕 ・○手続名又は関数名 手続又は関数を宣言する。 ・型名: 変数名 変数を宣言する。 ・/* 注釈 */ 、 // 注釈 注釈を記述する。 ・変数名 ← 式 変数に式の値を代入する。 ・手続名又は関数名(引数, …) 手続又は関数を呼び出し、引数を受け渡す。
・if (条件式1) 処理1 elseif (条件式2) 処理2 elseif (条件式n) 処理n else 処理n + 1 endif 選択処理を示す。条件式を上から評価し、最初に真になった条件式に対応する処理を実行する。以降の条件式は評価せず、対応する処理も実行しない。どの条件式も真にならないときは、処理n + 1を実行する。各処理は、0以上の文の集まりである。elseifと処理の組みは、複数記述することがあり、省略することもある。elseと処理n + 1の組みは一つだけ記述し、省略することもある。
・while (条件式) 処理 endwhile 前判定繰返し処理を示す。条件式が真の間、処理を繰返し実行する。処理は、0以上の文の集まりである。
・do 処理 while (条件式) 後判定繰返し処理を示す。処理を実行し、条件式が真の間、処理を繰返し実行する。処理は、0以上の文の集まりである。
・for (制御記述) 処理 endfor 繰返し処理を示す。制御記述の内容に基づいて、処理を繰返し実行する。処理は、0以上の文の集まりである。
〔演算子と優先順位〕(上ほど優先度が高い) ・式:() . ・単項演算子:not + - ・二項演算子(乗除):mod × ÷ ・二項演算子(加減):+ - ・二項演算子(関係):≠ ≦ ≧ < = > ・二項演算子(論理積):and ・二項演算子(論理和):or 注記 演算子 . は、メンバ変数又はメソッドのアクセスを表す。 演算子 mod は、剰余算を表す。
〔論理型の定数〕 true, false
〔配列〕 配列の要素は、"["と"]"の間にアクセス対象要素の要素番号を指定することでアクセスする。なお、二次元配列の要素番号は、行番号、列番号の順に","で区切って指定する。 "{"は配列の内容の始まりを、"}"は配列の内容の終わりを表す。ただし、二次元配列において、内側の"{"と"}"に囲まれた部分は、1行分の内容を表す。
〔未定義、未定義の値〕 変数に値が格納されていない状態を、"未定義"という。変数に"未定義の値"を代入すると、その変数は未定義になる。
出典:令和5年度 基本情報技術者試験 科目B 公開問題 問4
※ 解説は SkillStack 編集部が作成したものです。Web 表示のため、図表の配置や表記を一部改めています。