源码(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函数,第二个也冲突,使用第三个……,以此类推。
总结
哈希表是最常见的数据结构之一,其中哈希冲突的处理是重点。处理的方法有分离链接法、开放寻址法和再散列法。