hash冲突解决
解决方法:拉链法,又称为链地址法
其基本思想是将所有具有相同哈希值的元素链接在一起,形成一个链表。
解决方法:开放地址--线性探测法
https://www.cnblogs.com/-beyond/p/7726347.html
关注点:
1、hash冲突元素的插入
2、已有元素的删除和同hash值元素的移动
3、扩容
1、插入操作:
目前有一个长度为8的数组,选择的hash函数是 e.key%8,这个8是指数组的长度(容量),当数组长度发生变化,hash函数也应该变化。
加入一个新元素e2,key为13,hash函数计算出也应该存到位置5,因为13%8=5,但是发现位置5已经被占用了,此时就位置6有没有被占用,此时发现位置6没有被占用,则e2就存到位置6了
一个e4,key为29,发现还是存到位置4,并且位置5、6、7已经都被占用了,此时只能从头考虑位置0了,发现位置0未被占用,则将e4存到位置0
2、查找操作
如果要查询一个key为13的元素,通过计算key为13,对应位置5,但是位置5的key为5,与13不匹配,此时往后看位置6,发现位置6的key为13,与要查找的key相等,此时查找成功,返回e2即可;
3、删除操作
在删除元素后,要将其后面的元素进行重新确定位置,也就是rehash,否则下次查询可能有问题,过程如下:
删除位置6的元素,所以看位置6后面的元素,7->0->5,每个元素都需要计算hash,确定新位置。
比如位置7的key为21,发现应该调整到位置5,发现位置5已经有了元素,看位置6,发现位置6空着,则将元素e3放入位置6
接着看位置0的元素是否需要调整,在进行计算并且经过上面的流程后,e4应该调整到位置7
4、扩容
一般来说,并不是当数组没有空位时才扩容,而是数组元素达到一定阈值后就进行扩容,但是需要注意的是数组扩容要做的不只是数组扩容,还需要将旧数组中的元素拷贝到新数组中。
在拷贝的过程中,需要重新计算每个元素的hash值,也就是确定每个元素在新数组中的位置,其实从左往右遍历旧数组当中的元素,依次插入到新数组中,有冲突就按照原来的方式解决冲突即可。
扩容后,新的散列函数为e.key%16:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2019-09-29 【JVM】GC日志样例解读