メインコンテンツへ
アルゴリズムとプログラミングハッシュテーブル

ハッシュテーブルのオープンアドレス法における衝突解決の説明として正しいものはどれか。

ア.衝突が発生したとき、データをファイルに書き出して後で再挿入する。
イ.衝突が発生しないようにハッシュ関数を動的に変更する方式である。
ウ.衝突が発生したとき、そのキーをリンクリストに追加することで同じバケットに複数のデータを格納する。
エ.衝突が発生したとき、テーブル内の別の空きスロットを探してデータを格納する。正解

解説

オープンアドレス法は「駐車場が満車なら近くの空きスペースを探す」方式。チェイン法(連結リスト)と対比して理解するのが鉄則です。

なぜ エ が正解か

オープンアドレス法では、ハッシュ衝突が起きたとき同じテーブルの配列の中で別の空きスロットを探します(プロービング)。代表的な探索方法に、 ・線形探索法(Linear Probing): 1つずつ隣を調べる ・二次探索法(Quadratic Probing): 1²,2²,3²...スロット先を調べる ・ダブルハッシュ法: 別のハッシュ関数で次の位置を決める があります。テーブルが満杯になるとスロットがなくなるためロードファクター(充填率)の管理が重要です。

なぜ ア は間違いか

データをファイルに書き出す方式はハッシュテーブルの一般的な実装には存在しません。ハッシュテーブルはインメモリのデータ構造として機能するのが基本です。

なぜ イ は間違いか

ハッシュ関数を動的に変更する方式は「動的ハッシュ」や「拡張ハッシュ」と呼ばれる異なる概念です。オープンアドレス法はハッシュ関数を変えるのではなく、テーブル内の別の位置を探す方式です。

なぜ ウ は間違いか

リンクリストを使って同じバケットに複数データを格納するのは「チェイン法(Separate Chaining)」の説明です。オープンアドレス法は一つの配列内に全データを収める方式で、チェイン法とは逆の発想です。

出典: AI生成問題(学習用)