持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天点击查看活动详情
什么是散列表
是一种数据结构 他主要是将键值 通过一个哈希函数 映射到表中的一个位置实现快速查找 哈希函数: 例如 键值%17 = 表中的下标位置 键值2004 通过哈希函数后 2007%17 就会得到表中下标的位置 这就是哈希表映射的方法 但是很明显这个值是会重复的 就产生了哈希冲突
如何解决哈希冲突
链表式解决 HashMap的哈希冲突解决方法
就用链表的方法 当发生冲突的时候就放到next的位置
有点
处理冲突简单 平均查找长度较短 用于没办法确定表长度 因为各节点的链式都是动态申请的 删除结点的操作易于实现。只要简单地删去链表上相应的结点即可
缺点
会浪费空间 指针占用较大空间时,会造成空间浪费,若空间用于增大散列表规模进而提高开放地址法的效率。
开放地址
线性探测
就是如果重复了发生了冲突 就往后一格放
结果就是这样
那么最开始15%13 是2 2是空的就放在2那
然后2%13 发现2被占用了 就放在3的位置
再38%13 是12 就放12那
28%13是2 发现2被占用了 往后移发现3也被占用了 再往后移放在4
4%13是4 发现4被占用了就放5
重点! 12%13 发现12被占用了 就循环放到最前面 0的位置
平方探测
发生冲突了 第一次就是+1 第二次-1 第三次+2^2^ 第四次-2^2^ 第五次3^2^以此类推
双哈希
就是又设置了一个哈希函数 有两个哈希函数 当发生冲突的时候就使用第二个哈希函数
对2进行哈希的时候就会发现2位置有了 就进行第二个哈希7-(2%7) = 5就在第一个哈希结果的基础上+5 也就是2+5=7如果7还是有了 就再+5
哈希表要满了怎么办
当哈希表存储量超过70%就会再次创建一个新的哈希表 新表的尺寸是原表的两倍以上 一般都选个质数 最后再把之前的数据通过哈希计算放到新表中