バケットは、ハッシュ関数の結果である単純な高速アクセスの場所(配列インデックスなど)です。
ハッシュの考え方は、複雑な入力値を、データを迅速に抽出または保存するために使用できる別の値に変換することです。
人々の名前を番地にマッピングするための次のハッシュ関数を検討してください。
まず、姓名からイニシャルを取得し、両方を数値(0から25、「A」から「Z」)に変換します。最初の値に26を掛け、2番目の値を加算すると、0
から675
までの値(26 * 26
の個別の値またはバケットID)が得られます。このバケットIDは、情報を保存または取得するために使用されます。
これで、perfectハッシュ(各許容入力値がdistinctバケットIDにマップされる)を使用できるため、バケットには単純な配列で十分です。その場合、676の番地の配列を維持し、バケットIDを使用して目的の住所を見つけることができます。
+-------------------+
| George Washington | -> hash(GW)
+-------------------+ |
+-> GwBucket[George's address]
+-------------------+
| Abraham Lincoln | -> hash(AL)
+-------------------+ |
+-> AlBucket[Abe's address]
しかし、これはジョージ・ウェントとアラン・ランガーが将来問題を引き起こすことを意味します。
または、不完全ハッシュ(JohnSmithとJaneSeymourが同じバケットIDで終わるようなハッシュ)を持つこともできます。
その場合、アドレスのcollectionを維持するために、単純な配列よりも複雑なバッキングデータ構造が必要です。これは、リンクリストのように単純な場合もあれば、まだ複雑な場合もありますanother hash:
+------------+ +--------------+
| John Smith | | Jane Seymour |
+------------+ +--------------+
| |
V V
hash(JS) hash(JS)
| |
+-----> JsBucket <----+
\/
+-----------------------------------+
| "John Smith -> [John's address] |
| "Jane Seymour -> [Jane's address] |
+-----------------------------------+
次に、最初のハッシュルックアップと同様に、特定の情報を見つけるために、バケット自体の中で追加レベルの検索を実行する必要があります。
FromWikipedia:
ハッシュテーブルまたはハッシュマップは、ハッシュ関数を使用して、キー(人の名前など)と呼ばれる識別値を関連する値(電話番号など)にマッピングするデータ構造です。したがって、ハッシュテーブルは連想配列を実装します。ハッシュ関数は、キーを対応する値が検索される配列要素(スロットまたはバケット)のインデックス(ハッシュ)に変換するために使用されます。
配列/ベクトルの各エントリはバケットと呼ばれます。
Bucketは、少なくともインデックスとして機能するハッシュ値を含む構造体だと思います(ハッシュ値はハッシュ関数によって生成されます)が、構造体自体はエントリ(データ)が含まれる場合と含まれない場合があります。
図:
[ハッシュ値] [実際のデータを指す] ---> [実際のデータ]
| <------------バケット構造------> |
[ハッシュ値] [実際のデータ]
| -----バケット構造---> |
[ハッシュ値]部分がインデックスとして機能するのです。
hash_table Wikipedia のこれらの写真は非常に簡単です。
下の写真は、エントリ(データ)をバケット内に保存することも、独自のデータ構造で保存することもできますが、バケットは単にデータを指していることを示しています。
再ハッシュと合体ハッシュはどちらも、事前に決定された固定テーブルサイズを前提としています。レコード数がテーブル位置の数を超えた場合、より大きなテーブルを割り当ててハッシュを再計算せずにレコードを挿入することはできません。
ハッシュの衝突を解決する別の方法は個別のチェーンです。用語バケットは通常、個別のチェーンで使用されます。個別のチェーンには、キーが特定の値にハッシュされるすべてのレコードに対して個別のリンクリストを保持することが含まれます。
ハッシュ関数が0からtablesize-1までの値を生成するとします。次に、サイズtablesizeのヘッダーノードの配列バケットが宣言されます。この配列はハッシュテーブルと呼ばれます。
Bucket [i]、バケットエントリは、キーがiにハッシュするすべてのレコードのリストを指します。レコードを挿入するには、リストヘッドバケット[i]にアクセスし、レコードを末尾に挿入します。