私は C でデータ構造とアルゴリズムとソフトウェアの原則を読んで、データ構造の内部に頭を悩ませようとしていますが、2 つのことが本当に気になります。
(1) バケット内のアイテムがすべて同じハッシュを持つ場合、検索しているアイテムがバケット内のどのアイテムであるかを決定する際、ハッシュ テーブルはどのように処理しますか?
例えば
- キー、値を取得
- キーでハッシュアルゴリズムを使用して、値を入れようとするインデックスを見つけます
- スロットが使用されているが、バケット (単一のエントリ) がない場合は、バケットを作成し、現在のアイテムをバケットにスローしてから、現在の値をバケットにスローします。
- すべてのキーが同じハッシュにマップされ、バケット内のアイテムには検索するキーがないため、どの値がどのキーに属しているかがわからない「紛失および発見の問題」があります。キーによるバケット。
これは、バケットが各エントリのキーと値を保存する場合に機能しますが、ハッシュ テーブルがキーとエントリの値を保存することを確認するサイトが見つからないため、混乱しています。
(2) ハッシュテーブルは、インデックスの値がキーの正しい値であるかどうか、またはプロービングが衝突を検出して別の場所に配置したかどうかをどのように判断しますか。
例えば。
- キー、値を取得
- index(0) を見つけるためのハッシュ キー
- インデックスが取得されたら、スロットが見つかるまで (スロット 1 が空になるまで) 線形検索を実行する単純なプローブ アルゴリズムを使用します。
- ここでキーを検索し、インデックス 0 を見つけます。ハッシュは、インデックス 0 がこのキーの正しいアイテムではなく、スロット 1 にプローブされていることをどのように認識しますか?
繰り返しますが、テーブルがキーとエントリの値を保存する場合、これは私には理にかなっていますが、ハッシュがエントリの値とともにキーを保存するのか、それともハッシュ インデックスのアイテムを確実にする別の方法があるのか はわかりませんまたはバケットインデックスが正しい項目であるか、誤解している場合。
質問を明確にするために: ハッシュ テーブルは値と共にキーを保存してバケットとプローブ シーケンスを明確にしますか、それともハッシュのあいまいさを避けるために何か他のものを使用しますか?
大雑把に定式化された質問で申し訳ありませんが、私はただ尋ねなければなりませんでした。
ありがとうございます。