一文詳解哈希表的哈希衝突

源碼(Java)

在java中,哈希表用hashtable表示,存儲結構是通過數組來實現的。

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {

    /**
     * The hash table data.
     */
    private transient Entry<?,?>[] table;

    /**
     * The total number of entries in the hash table.
     */
    private transient int count;
    ............................
}

哈希衝突

分離鏈接法

將散列到同一個值得所有元素保留到一個表中。每個位置存放一個指向單鏈表的指針,衝突的元素依次插入這個單鏈表的末尾。
在這裏插入圖片描述

開放尋址法

設H(key)是哈希函數,如果H(key1) = H(keyi),那麼keyi存儲位置Hi = ( H(key) + di ) mod m,其中m爲表長。

線性探測法

  1. 線性探測再散列。

如果不同的key值映射到一個位置時,繼續往後探測,找到空出插入。(當index=table.size()時將index置爲0繼續找),找到空處插入。

  1. 平方探測再散列

與左邊不同的點是,從映射位置處起,在i ^ 2後的位置插入數據。(數據較分散)

  1. 隨機探測在散列

再散列法

準備若干個hash函數,如果使用第一個hash函數發生了衝突,就使用第二個hash函數,第二個也衝突,使用第三個……,以此類推。

總結

哈希表是最常見的數據結構之一,其中哈希衝突的處理是重點。處理的方法有分離鏈接法、開放尋址法和再散列法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章