[Javaデータ構造]ハッシュテーブルの競合を回避する方法


序文

1.ハッシュテーブルとは何ですか?

これはBaiduで与えられた答えです:
ここに画像の説明を挿入します
ここに画像の説明を挿入します
要するに、なぜそのようなデータ構造があるのですか?
比較せずに一度にテーブルから検索したい要素を取得したいので。そのため、ハッシュテーブルを構築し、特定の関数(ハッシュ関数)を介して、要素の保存場所とそのキーコードの間に1対1のマッピング関係を確立できるため、より迅速に見つけることができます。検索。検索したい要素。
次のコードデモンストレーションでは、ハッシュテーブルが最下層で使用されているため、各文字は文字列に出現する回数と1対1で対応しています。

public static void main(String[] args) {
    
    
        String s="huddiolabcsjddddop";
        int[] count=new int[26];
        for(char ch:s.toCharArray()){
    
    
            int idx=ch-'a';
            count[idx]++;
        }
        System.out.println(Arrays.toString(count));
        

第二に、ハッシュ衝突とは何ですか

1.ハッシュの衝突が発生する理由

2つのデータ要素のキーワードKiとKj(i!= j)については、次のようになります。Hash(Ki)== Hash(Kj)、つまり、異なるキーワードがハッシュ関数を介して同じハッシュアドレスを計算します。この現象ハッシュ衝突またはハッシュ衝突と呼ばれます。

2.ハッシュの競合を回避できますか?

まず、ハッシュテーブルの基になる配列の容量が、実際に格納するキーワードの数よりも少ないことが多いため、明確にする必要があります(つまり、格納する要素の範囲が不確実な場合は、複数の要素である可能性がありますハッシュアドレスは同じです)、これによりハッシュの衝突が避けられないため、衝突率を可能な限り減らすことができます。

3、ハッシュの競合を解決する方法

1.線形検出

たとえば、配列が与えられた場合、int [] array = {4,5,6,9,1,7,44}
その挿入操作は次のとおりです。1。ハッシュ関数を使用して、ハッシュテーブルに挿入される要素の位置を取得します。
2.この位置に要素がない場合は、直接挿入します。この位置に要素がある場合は、線形検出方法を使用して、挿入する次の空の位置を見つけます。
ここに画像の説明を挿入します

2.ジッパー方式

ここに画像の説明を挿入します
ジッパー法は、大きなコレクションの探索問題を小さなコレクションの探索問題に変換すると考えることができます。


総括する

線形検出法の効率:
ここに画像の説明を挿入します

1.ハッシュテーブルのすべての要素について、比較の平均数はいくつですか。
(1 + 1 + 1 + 1 + 1 + 5 + 1)/ 7 = 1.57

2.ハッシュテーブルにないすべての要素について、比較の平均数はいくつですか。
(各添え字について、それが連続しているかどうかを判断します)
(1 + 2 + 1 + 1 + 7 + 6 + 5 + 4 + 3 + 2)/ 10 = 3.2。

おすすめ

転載: blog.csdn.net/m0_46551861/article/details/109632573