この例では、HashMapのハッシュアルゴリズムについての説明

ダニエル・K:

私はこの質問を解決しようとしていました。

唯一の3つのユニークな番号を持つ整数の配列を考えるとO(n)の時間に(それぞれの周波数を持つ)の昇順で番号を印刷します。

私は使用せずにそれを解決したかったcounting sortので、私は思った私は何ができるで、アルゴリズムfor loopとに数字を挿入HashMapし、その後loopを通じてHashMap entrySet、必要な情報を印刷します。

ここでの機能は以下のとおりです。

public static void printOut(int[] arr){
        Map<Integer,Integer> hm=new HashMap<Integer,Integer>();
        for(int num : arr){
            if(hm.containsKey(num)){
                hm.put(num,hm.get(num)+1);
            }else{hm.put(num,1);}
        }
        for(Map.Entry<Integer,Integer> entry : hm.entrySet()){
            System.out.println("Key= "+entry.getKey()+" Value= "+entry.getValue());
        }
}

これは私の私の配列だったときにトリックをしました: [3, 3, 2, 1, 3, 2, 1]

私は衝突につながるはず配列を使用しようとしたので、しかし、上記の配列は、任意の衝突につながるべきではない、私は私の機能をテストしたアレイのうちの1つでした。[6,6,9,9,6,3,9]まだ私の機能は、まだ印刷されKeysているため、私は混乱しましたこれは、昇順に私は時に思ったKeyのは、HashMap整数ハッシュコードがあるべきであるhashIndex = key % noOfBuckets私は数字を持っているときに6, 9 and 3、私としてHashMap keys、私はそこに衝突だろうと私の関数は(上記使用される配列に基づいて)印刷する必要があります考えました:

Key= 6 Value= 3
Key= 9 Value= 3
Key= 3 Value= 1 

しかし、その代わりに、それは印刷します:

Key= 3 Value= 1
Key= 6 Value= 3
Key= 9 Value= 3

私は私が代わりに私が期待していた答えを解決しようとしていた質問への適切なソリューションを持って、なぜ誰も私に説明していただけますか?

ありがとうございました。

セルジュHarnyk:
  1. ハッシュマップ/ハッシュテーブル内の「衝突」という用語は、二つの異なるキーが同じハッシュコードを有する場合の状況です。衝突を解決するが、あなたは文字通り3つの整数キーを持っている場合、これは間違いなくあなたのケースではないためHashMapの使用一覧/ RBツリーのJava実装。
  2. HashMapのは、挿入(または他の)要素の順序を保証するものではありません。いくつかの順序を保証することができますのLinkedHashMapまたはTreeMapのような異なる別の構造があります。しかし、あなたの場合のために、この構造を使用すると、一定の時間に3つの要素のコレクションを並べ替えることができますわずかなオーバーヘッドの原因です。あなたもあなたのタスクのためのMap.Entryの配列の代わりに、HashMapを使用することができます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=311992&siteId=1