【かっこうはっしゅほう】

カッコウハッシュ法 とは?

最終更新:
💡 先客を追い出して席を取る、カッコウ流のハッシュ表

複数のハッシュ関数を使い、衝突したら先にいる要素を追い出して別の候補位置へ移すハッシュ表の方式。検索が最悪でも決まった回数の確認で済む。

📌 このページのポイント
Xを入れ、先客Aを別の候補へXh1(X)表1表2空DB空空空AEC空Aを移すh2(A)それぞれの要素の候補位置を使う検索:基本形では最悪でも2か所を確認
基本形(2つの表・2つのハッシュ関数・1か所1要素)の挿入例。Xの挿入先と、追い出されたAの移動先を示す。
ひよこ ひよこ
カッコウハッシュ法って何?
ペンギン先生 ペンギン先生
挿入先にいる要素を追い出し、その要素を別の候補へ移すハッシュ表の方式だよ。先客の場所を取る様子を、カッコウの巣にたとえた名前なんだ。
ひよこ ひよこ
具体的にはどうやって入れるの?
ペンギン先生 ペンギン先生
2つのハッシュ関数を使うよ。各データは、2つのハッシュ関数が指す2か所のどちらかに必ず置くんだ。挿入するとき、どちらかの場所が空いていれば、そこへ入れておしまいだね。
ひよこ ひよこ
両方とも埋まっていたらどうなるの?
ペンギン先生 ペンギン先生
片方の場所にいる既存の要素を追い出して、そこに新しい要素を入れるんだ。追い出された要素は、自分のもう一方の候補の場所へ移るよ。そこにも先客がいれば、また追い出す。これを空きが見つかるまで繰り返すんだね。
ひよこ ひよこ
それって、ずっと終わらないことはないの?
ペンギン先生 ペンギン先生
追い出しがループしたり、決めた試行回数を超えたりすることがあるよ。その場合はハッシュ関数を替えて作り直すなどの対処をする。基本形の理論上の解析では、表全体の使用率を半分未満に保つなどの条件があるんだ。
ひよこ ひよこ
そんな面倒なことをして、何が嬉しいの?
ペンギン先生 ペンギン先生
基本形では、要素の候補が2か所に決まっているから、検索は最悪でも2か所の確認で済むよ。一方、1回の挿入では追い出しや作り直しで時間がかかる場合がある。ハッシュ関数の選び方や表の空きに条件を置いた解析では、多数の更新をならして期待定数時間で扱えると示されているんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「カッコウハッシュ法」って出てきたら「先客を別の候補へ移して挿入するハッシュ表」と思えばだいたいOK!
📖 おまけ:英語の意味
「Cuckoo Hashing」 = カッコウハッシュ法
💬 新しい要素が先客を追い出して場所を取る様子を、カッコウの巣の比喩で表した名前だよ。

参考資料

← 用語集にもどる