源碼(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爲表長。
線性探測法
- 線性探測再散列。
如果不同的key值映射到一個位置時,繼續往後探測,找到空出插入。(當index=table.size()時將index置爲0繼續找),找到空處插入。
- 平方探測再散列
與左邊不同的點是,從映射位置處起,在i ^ 2後的位置插入數據。(數據較分散)
- 隨機探測在散列
再散列法
準備若干個hash函數,如果使用第一個hash函數發生了衝突,就使用第二個hash函數,第二個也衝突,使用第三個……,以此類推。
總結
哈希表是最常見的數據結構之一,其中哈希衝突的處理是重點。處理的方法有分離鏈接法、開放尋址法和再散列法。