一、 什么是哈希表(Hash Tables)
为每个Object创建一个Index,以一对一的形式放在一张表中。哈希表的优势就是查找速度非常快,但是会要更多的储存空间。
二、哈希函数(Hash Function)
Hash function是为决定为每个Object生成Index的规则是怎样的。
例: 为一个字符串"abcdef"生成index
我们使用其每个字符的ASCll值的和,也就是97,98,99,100,101和102的和597模上质数599(因为指数只能被1和本身整除),也就是说字符串"abcdef"的index是2.
String | Hash function | Index |
---|---|---|
“abcdef” | (97+98+99+100+101+102)%599 = 2 | 2 |
但是当字符只改变顺序或者有字符串的hash后的index一样时,会造成hash冲突,如图:
三、种解决hash冲突的方案
1. 拉链法(Separate chaining)
当index相同时放在同一index下的链表下。
增删改查多时可以使用此方法,但需要的存储空间比其他二个方法大。
2. 线性探测法(Linear probing)
当出现同一index时,在hash表中逐一条目进行检查,如果当前条目已经被占用就往下继续寻找,直到找到为空的条目。
条目过多时,有可能会造成内存溢出。
3. 再哈希法(Double hashing)
这种方法是同时构造多个不同的哈希函数:
Hi=RH1(key) i=1,2,…,k
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。