オープンハッシュ(個別チェーン):
オープンハッシュでは、ハッシュテーブルのセルに添付されたリンクリストにキーが格納されます。
クローズドハッシュ(オープンアドレス指定):
クローズドハッシュでは、リンクリストを使用せずに、すべてのキーがハッシュテーブル自体に格納されます。
なぜオープン、クローズ、セパレートと呼ばれているのか理解できません。誰かがそれを説明できますか?
オープンハッシュ(個別チェーン):
オープンハッシュでは、ハッシュテーブルのセルに添付されたリンクリストにキーが格納されます。
クローズドハッシュ(オープンアドレス指定):
クローズドハッシュでは、リンクリストを使用せずに、すべてのキーがハッシュテーブル自体に格納されます。
なぜオープン、クローズ、セパレートと呼ばれているのか理解できません。誰かがそれを説明できますか?
回答:
「クローズ」と「オープン」の使用は、特定の位置またはデータ構造を使用することに縛られているかどうかを反映しています(これは非常にあいまいな説明ですが、残りが役立つことを願っています)。
たとえば、「オープンアドレス指定」の「オープン」は、オブジェクトがハッシュテーブルに格納されるインデックス(別名アドレス)がそのハッシュコードによって完全に決定されていないことを示しています。代わりに、インデックスはハッシュテーブルに既に存在するものに応じて異なる場合があります。
「クローズドハッシュ」の「クローズド」とは、ハッシュテーブルを離れないことを意味します。すべてのオブジェクトは、ハッシュテーブルの内部配列のインデックスに直接格納されます。これは、ある種のオープンアドレッシング戦略を使用することによってのみ可能であることに注意してください。これが、「クローズドハッシュ」と「オープンアドレス」が同義語である理由を説明しています。
これをオープンハッシュと比較してください。この戦略では、ハッシュテーブルの配列に実際に格納されているオブジェクトはありません。代わりに、オブジェクトがハッシュされると、ハッシュテーブルの内部配列とは別のリストに格納されます。「オープン」とは、ハッシュテーブルを離れ、別のリストを使用することで得られる自由を指します。ちなみに、「個別リスト」は、オープンハッシュが「個別チェーン」としても知られている理由を示しています。
つまり、「クローズ」とは、常にオブジェクトが常にハッシュテーブル内に直接格納されることを保証する場合(クローズハッシュ)のような、ある種の厳密な保証を指します。次に、「クローズ」の反対は「オープン」なので、そのような保証がない場合、戦略は「オープン」と見なされます。
「ハッシュテーブル」である配列があります。
Open Hashingでは、配列の各セルは衝突を含むリストを指します。ハッシュにより、リンクリスト内のすべてのアイテムに同じインデックスが作成されました。
クローズドハッシュでは、すべてに対して1つの配列のみを使用します。衝突は同じ配列に格納します。トリックは、衝突から衝突ユニットにジャンプするためのスマートな方法を使用して、必要なものを見つけることです。そして、これを再現可能/確定的な方法で行います。
オープンアドレッシングという名前は、要素の場所(「アドレス」)がそのハッシュ値によって決定されないという事実を指します。(この方法はクローズドハッシュとも呼ばれます)。
で別々の連鎖、各バケットは独立しており、同じインデックスを持つエントリのADT(リスト、二分探索木、など)のいくつかの並べ替えを持っています。良いハッシュテーブルでは、挿入や検索などのためにO(1)の順序の操作が必要なため、各バケットには0または1つのエントリがあります。
これは、mod演算子を使用した単純なハッシュ関数(明らかに、悪いハッシュ関数)で C ++を使用した個別の連鎖の例です。