哈希表解决冲突的方法
-
链地址法(拉链法):将数组中每个位置存储的元素改成一个链表
-
开放地址法:寻找空白单元格来存储重复数据,寻找空白单元格的方法:
线性探测:
插入:步长为1,一点点寻找空白位置。
查找:跟插入过程类似,哈希化后,得到一个索引,比对元素,不相同则进行线性探测,如果查找过程中遇到空白位置,就停止查找。
删除:查找目标元素后,不可以设置为null,因为哈希表后面的位置有可能还存在冲突的元素,设置为null之后,线性探测就找不到后面元素了。删除时一般设置为一个特殊的值。
缺点:会造成数据的聚集。聚集会影响哈希表的性能,后面发生的冲突需要寻找很久
二次探测:解决聚集问题
从x位置开始,第一次x+1²,第二次x+2²,第三次x+3²,一次跳多步
缺点:连续插入哈希化后索相同的数据,后面的数据也需要探测很多次,因为二次探测的每次探测的步长都是一样的,是一种特殊的聚集
再哈希法:利用关键字确定步长,解决二次探测聚集问题
第一次哈希化作为下标,第二次哈希化作为步长
第二次哈希化要求:需要和第一次哈希化的结果不同,步长不能为0
第二次哈希化函数:
stepSize = constant -(Key % constant)
constant是质数,且小于数据容量