プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

データ構造における二次プロービング(Quadratic Probing)とは?仕組みと具体例を解説

二次プロービング(Quadratic Probing)とは

二次プロービングは、ハッシュ表で衝突が発生した際に対応する手法の一つである「オープンアドレス法(open addressing)」で用いられる衝突解決技術です。

まず、通常のハッシュ関数 h′(x) : U → {0, 1, ..., m − 1} が与えられているものとします。オープンアドレス法では、この基本となるハッシュ関数に別の要素を組み合わせて二次式を構成することで、実際に使用するハッシュ関数 h(x) を作り上げます。

h′(x) = x mod m

h(x, i) = (h′(x) + i²) mod m

ここで使用する二次式は、定数を加えることで別の形に変更することも可能です。

i の値は 0, 1, ..., m − 1 の範囲で変化します。探索は i = 0 から始め、ハッシュ表内の空きスロットが見つかるまで i を順に増やしていきます。最初の i = 0 の時点では、h(x, i) は元のハッシュ関数 h′(x) と同一の値となります。

二次プロービングのポイント

線形プロービングでは、隣接するスロットを順番に調べるため「一次クラスタリング(primary clustering)」と呼ばれる、データが特定の場所に集中する問題が起きやすいという弱点があります。二次プロービングでは探索位置を i² ずつ離すため、このようなデータの偏り(クラスタリング)を大幅に緩和できます。

ただし、同じ初期ハッシュ値を持つ異なるキーは同一の探索順序をたどる「二次クラスタリング(secondary clustering)」が発生する点には注意が必要です。また、表のすべてのスロットを効率よく利用するには、表のサイズ m を素数に設定し、負荷率を0.5以下に抑えることが推奨されます。

具体例

サイズ20(m = 20)のハッシュ表を用意し、次の要素を二次プロービング方式で挿入していきます。

挿入する要素:{96, 48, 63, 29, 87, 77, 48, 65, 69, 94, 61}

各要素に対して h′(x) = x mod 20 を計算し、衝突が発生した場合は h(x, i) = (h′(x) + i²) mod 20 に従って、空きスロットが見つかるまで探索を続けます。たとえば、48 は初回の計算でインデックス8に配置されますが、後から同じハッシュ値を持つもう一つの 48 が挿入される際には衝突が生じるため、i² を加算した位置へと再配置されます。

データ構造における二次プロービング(Quadratic Probing)とは?仕組みと具体例を解説 

ハッシュ表

データ構造における二次プロービング(Quadratic Probing)とは?仕組みと具体例を解説

  1. データ構造のB+ツリーとは?仕組みとB木との違い、メリットを解説

    B+ツリー(B+木)は、B木(Bツリー)を拡張したデータ構造です。B木よりも効率的な挿入・削除・検索を実現できるよう設計されており、データベースやファイルシステムのインデックス構造として広く活用されています。 B+ツリーの基本構造 通常のB木では、キーとレコード(実データ)が内部ノードと葉ノードの両方に格納されます。一方、B+ツリーでは、実際のレコードはすべて葉ノードにのみ格納され、内部ノードには検索用のキー値だけが保持されます。 さらに大きな特徴として、B+ツリーの葉ノード同士は連結リストのようにリンクされています。この構造により、範囲検索や順次アクセス(シーケンシャルスキャン)が非常に容易

  2. ハーフエッジデータ構造(HalfedgeDS)とは?基本概念とCGAL実装例をわかりやすく解説

    はじめにテンプレートパラメータとして用いられるハーフエッジデータ構造(Halfedge Data Structure、略称 HalfedgeDS)は、頂点・辺・面の接続情報(インシデンス情報)を管理できる、辺を中心としたデータ構造として定義されています。平面地図(planar map)や多面体など、任意の次元空間に埋め込まれた向き付け可能な2次元曲面の表現に適した構造です。このデータ構造では、各辺が逆向きの向きを持つ2つのハーフエッジ(半辺)に分割されます。各ハーフエッジは、隣接する1つの面と1つの頂点への参照を保持し、逆に各面および各頂点にも、それぞれ1つの接続ハーフエッジが格納されます。さ