ロビンフードハッシュとは?データ構造における公平な衝突解決手法を徹底解説
ロビンフードハッシュ(Robin Hood Hashing)とは
ロビンフードハッシュは、オープンアドレス法(開番地法)に分類されるハッシュ手法のひとつです。「富者から奪って貧者に与える」という伝説の英雄ロビンフッドの名前にちなんだこの方式は、要素ごとの探索時間に偏りが生じないよう、より公平な衝突解決戦略を採用している点が最大の特徴です。
従来の線形探査などの手法では、挿入順序やハッシュ値の分布によって、特定の要素だけ探索に長い時間がかかるといった「格差」が発生しがちでした。ロビンフードハッシュは、この格差を積極的に是正することで、最悪ケースの性能を大幅に改善します。
挿入時のルール:「若い」要素が道を譲る
要素を挿入する際、新しい要素 x を位置 xi に配置しようとしたところ、すでに別の要素 y が同一の位置(yj = xi)を占有していた場合を考えます。このとき、両者のうちより「若い」要素(ホームポジションからの移動回数が少ない要素)が先へ進むことになります。
- i ≤ j の場合: 要素 x の方が「若いため」、x を位置 xi+1、xi+2、… と順に試しながら挿入を続けます。
- i > j の場合: 要素 x をそのまま位置 xi に格納し、代わりに既存の要素 y を位置 yj+1、yj+2、… へと再挿入します。
このような要素の「入れ替え」を繰り返すことで、各要素のホームスロットからの距離(プローブ回数)のばらつきが小さく保たれ、探索時間が要素間で均等化されます。
理論的評価:二重対数時間の最悪ケース探索
Devroye らの研究によれば、初期状態が空のサイズ m = αn のテーブルに対して n 回の挿入をロビンフード挿入アルゴリズムで実行した場合、最悪ケース探索時間の期待値は次のようになります。
$$E[W]=\Theta(\log\log n)$$
さらに、この評価値はタイト(tight)であることが示されています。つまり、ロビンフードハッシュはオープンアドレス法の一形態でありながら、二重対数(doubly logarithmic)レベルの最悪ケース探索時間を達成できるのです。
参考までに、一般的な線形探査では負荷率が高まると最悪ケースの性能が大きく劣化しますが、ロビンフードハッシュは負荷率 α が 1 に近づいても安定した性能を維持できます。この特性から、Rust 言語の標準ライブラリ HashMap(2019年以前の実装)など、実用的なシステムにも採用されてきた実績のある手法です。
-
Rツリー(R-Tree)とは?空間データ構造の基本とクアッドツリーとの違いを徹底解説
本記事では、Rツリー(R-Tree)というデータ構造について詳しく解説します。Rツリーは、空間データのインデックスを効率的に格納するために設計された木構造であり、空間的な検索やデータの保存において非常に有用な仕組みです。Rツリーは現実世界のさまざまな場面で活用されており、主な応用例は以下の通りです。多次元情報のインデックス化ゲームデータの管理地理空間座標(ジオスペーシャルデータ)の保持仮想マップの実装Rツリーの構造例以下に、Rツリーによる空間データの表現例を示します。この空間データに対応するRツリーの構造は次のようになります。Rツリーの主な特性Rツリーには、以下のような重要な特性があります。R
-
ハーフエッジデータ構造(HalfedgeDS)とは?基本概念とCGAL実装例をわかりやすく解説
はじめにテンプレートパラメータとして用いられるハーフエッジデータ構造(Halfedge Data Structure、略称 HalfedgeDS)は、頂点・辺・面の接続情報(インシデンス情報)を管理できる、辺を中心としたデータ構造として定義されています。平面地図(planar map)や多面体など、任意の次元空間に埋め込まれた向き付け可能な2次元曲面の表現に適した構造です。このデータ構造では、各辺が逆向きの向きを持つ2つのハーフエッジ(半辺)に分割されます。各ハーフエッジは、隣接する1つの面と1つの頂点への参照を保持し、逆に各面および各頂点にも、それぞれ1つの接続ハーフエッジが格納されます。さ