名古屋工業大学 工学研究科 工学専攻 情報工学系 2023年度 計算機ソフトウェア(データ構造とアルゴリズム)
Author
GPT-5.6 Sol, 祭音Myyura
Description
問題27「計算機ソフトウェア」の設問 I について答えよ。
(1)
ハッシュ法による配列へのデータ格納と探索に関する次の記述の正誤を答えよ。ハッシュ関数の評価は とし、オープンアドレス法と線形探査を用いる。
- (ア) ハッシュ法では常に配列中の連続した領域にデータが格納される。
- (イ) ハッシュ法ではデータの格納と探索にかかる計算量が、配列内の空要素数に依存する。
- (ウ) 格納され得るすべてのデータについてハッシュ値が重複せず、同一データを複数回格納しないとする。このとき、十分な配列サイズがあれば、格納と探索をともに で実行できる。
- (エ) 異なるデータに対してハッシュ値が重複すると、ハッシュ法を利用できない。
- (オ) データ探索は最悪の場合でも となる。ただし、 は格納する配列のサイズである。
(2)
要素数 6 の配列 に対し、線形探査を用いるオープンアドレス法を考える。格納するデータは正の整数であり、 は空要素を表す。
Insert(x)
i <- 0
while (true) {
j <- Hash(x,i)
if ([a]) {
[b]
return [c]
}
i <- i + 1
if ([d]) return -1
}
Search(x)
i <- 0
while (true) {
j <- Hash(x,i)
if (i = 6 or H[j] = ∅) return -1
if (H[j] = x) return j
i <- i + 1
}
Hash(x,i)
return (x + i) mod 6
(ア)
とする。Search(x) を に対して実行したときの返り値と、return 実行時の をそれぞれ答えよ。
(イ)
Insert(x) が、格納成功時には格納した添字を、失敗時には を返すように、空欄 (a)--(d) を次から選べ。
| 選択肢 | 処理 | 選択肢 | 処理 |
|---|---|---|---|
| (A) | i | (B) | j |
| (C) | i = 6 | (D) | j = 6 |
| (E) | H[i] = ∅ | (F) | H[j] = ∅ |
| (G) | H[i] <- x | (H) | H[j] <- x |
| (I) | j <- j + 1 | (J) | -1 |
(ウ)
配列 のちょうど 3 要素に値が格納され、残り 3 要素が空であるとする。値の入る 3 要素の選び方はすべて等確率である。 に格納されていない任意の正整数 に対して、Search(x) 内で return が実行される瞬間に となる確率を求めよ。
(エ)
Hash(x,i) を次のように変更する。ただし、 は 1 以上の整数である。
- のとき、 の値を答えよ。
- 任意の正整数 について、 の探査で配列 の全要素を調べられる最小の を求めよ。なお、 と が互いに素であるとき、 は に対して の並べ替えとなることを用いてよい。
Kai
(1)
- (ア) 誤。ハッシュ値に応じて格納位置が決まるため、全データが一つの連続領域に入るとは限らない。
- (イ) 正。空要素が少なく、すなわち負荷率が高くなるほど、衝突後に必要な探査回数が増えやすい。厳密な回数はデータの配置にも依存する。
- (ウ) 正。衝突がなければ、ハッシュ値の計算と 1 回の配列アクセスで格納・探索できる。
- (エ) 誤。線形探査などの衝突解決法を用いれば格納できる。
- (オ) 誤。最悪の場合は配列の全要素を調べるため、時間計算量は となる。
したがって、
である。
(2)
(ア)
線形探査で調べる添字を順に追う。
| 調べる添字 | 返り値 | return 時の | |
|---|---|---|---|
| 3 | |||
| 9 | |||
| 4 | |||
| 8 |
よって、
である。各組は「返り値、」の順である。
(イ)
空要素を発見したとき、その添字 に を格納して を返す。6 箇所を探査しても空きがなければ失敗とする。したがって、
(a) H[j] = ∅ : (F)
(b) H[j] <- x : (H)
(c) j : (B)
(d) i = 6 : (C)
となる。
(ウ)
最初の二つの探査位置が使用中で、三つ目が空のときに限り、 で return が実行される。使用中の 3 要素の選び方は全部で
通りである。最初の二位置を使用中、三位置目を空と固定すると、残りの使用中 1 要素は他の 3 位置から選べるので 3 通りである。よって、求める確率は
となる。
(エ)
1.
、 では なので、探査幅は である。したがって、
より、
となる。
2.
が偶数なら探査幅は常に 1 であり、6 要素すべてを探査できる。 が奇数なら探査幅は であるため、全要素を探査する必要十分条件は
である。 では探査幅がそれぞれ となり 6 と互いに素ではない。 では探査幅が 5 となり、 である。したがって、
が最小である。
検算
プログラムで Search をそのまま実行し、 を確認した。また、使用中位置の 通りを全列挙すると、 で失敗する配置は 3 通りであった。さらに を順に調べると、すべての偶数・奇数 について 6 添字を一度ずつ探査できる最小値は となった。