1、链地址法
HashMap中发生hash碰撞时使用的就是这种方法,会以链表方式存储hash冲突的元素。当链表过长的时候必须要扩容,否则查找性能随着链表的长度增长而下降。
2、开放定址法
当哈希碰撞时,按照算法的特定方式去往下寻找到下一个空的散列桶。
如图77跟48碰撞,按照规定的算法往下查找到槽位为20是空的,所以77会放到20的槽位上。同理,插入78时,跟77发生哈希冲突,因为77移位占了他的位置,所以78也会往后找到空的槽位,因此放到了21槽。
这种方式会可能会导致哈希聚集在一起,从而导致后续更频繁的哈希冲突。
3、再哈希法(rehash)
按照特定的哈希算法先算出具体的位置,当发生哈希冲突时,可以按照其他的算法再重新哈希找到空的哈希槽。这种方式虽然不会导致元素聚集在一起,但是需要进行反复哈希运算。
4、Closed Hashing, Using Buckets(建立公共溢出区)
在开放地址法的基础上,每个槽位都有多个桶,当哈希碰撞时会放到同一个槽位的空桶中,知道所有的桶都满了,就将元素放到公共溢出区(overflow)
以上图片都是来自于下面的图示算法网站
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
hash冲突解决方案
最新推荐文章于 2025-04-28 20:31:26 发布