[訳]C言語は簡単なHash tableを実現する(4)
前章では、
衝突の処理
我々のハッシュテーブルは、競合を処理するために、オープンアドレスと呼ばれる二重ハッシュ技術を使用する.二重ハッシュは、2つのハッシュ関数を使用して、
ダブルハッシュ
アルゴリズム実装
前章:hash関数次章:HashテーブルAPIの完了
Hash table
の中で最も重要なhash
を説明し、偽コードとC言語で私たち自身のhash
を実現しました.hash
の中で
は避けられません.
が発生した場合、私たちはどのように有効な処理を変更しますか.この章では説明します.衝突の処理
hash
無限大の入力を有限の出力にマッピングし、異なる入力が同じ出力にマッピングされると
が発生し、各hash
は異なる方法で
を処理する.我々のハッシュテーブルは、競合を処理するために、オープンアドレスと呼ばれる二重ハッシュ技術を使用する.二重ハッシュは、2つのハッシュ関数を使用して、
が発生した後にレコードを格納するインデックスを計算する.ダブルハッシュ
i
発生
後、インデックスを取得するには、次の方法を使用します.index = hash_a(string) + i * hash_b(string) % num_buckets
が発生しない場合、i=0
であるため、インデックスはhash_a
の値であり、
が発生した後、hash_a
の結果はhash_b
の処理を1回行う必要がある.hash_b
は0
に戻り、第2項を0
に減少する可能性があります.これにより、hash
は複数のレコードを同じbucket
に挿入し、hash_b
の結果に1
を追加して処理することができます.これは、0
にならないことを保証します.index = (hash_a(string) + i * (hash_b(string) + 1)) % num_buckets
アルゴリズム実装
// hash_table.c
static int ht_get_hash(const char* s, const int num_buckets, const int attempt) {
const int hash_a = ht_hash(s, HT_PRIME_1, num_buckets);
const int hash_b = ht_hash(s, HT_PRIME_2, num_buckets);
return (hash_a + (attempt * (hash_b + 1))) % num_buckets;
}
前章:hash関数次章:HashテーブルAPIの完了