哈希冲突解决方法:开放寻址法、开链法
开链法
在每个表格元素中维护一个链表,STL的哈希表unordered_set、unordered_map用的就是开链法。
开放寻址法
当哈希函数计算出的元素插入位置已不可用时,按某种规律探测其他可用位置的方法,叫开放寻址法。因此删除元素时,不能立即删除。使用开放寻址法时,负载系数一定不超过1。
探测方法有许多,开放寻址法 按探测方法的不同 又可以分为以下几种方法:
1)线性探测
最简单的探测方法:线性探测。
线性探测有一个很大的问题:平均插入成本的成长幅度,远高于负载系数的成长幅度。这样的现象在hashing过程中称为主集团(primary clustering)。此时的我们手上有的是一大团已被用过的方格,插入操作极有可能在主集团所形成的泥泞中奋力爬行,不断解决碰撞问题,最后才射门得分,但是却又助长了主集团的泥泞面积。
2)二次探测
3)双重哈希(double hashing)
双重哈希的思想是在发生冲突时对键做第二个哈希函数。
双重哈希函数:
(hash1(key) + i * hash2(key)) % TABLE_SIZE
这里 hash1() 、 hash2() 是hash函数, TABLE_SIZE 是hash表大小 (如果发生冲突,i递增然后重复运算)
参考:STL源码剖析