hash碰撞解决办法

hash碰撞解决办法,第1张

在hash碰撞的情况下,主要的处理方法有:

1开放地址法

开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)

基本思想:当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。

2rehash(再hash法)

使用第二个或第三个计算地址,知道无冲突。比如:按首字母进行hash冲突了,则按照首字母第二位,进行hash寻址。

3链地址法(拉链法)

创建一个链表数组数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。

java hashmap使用的就是拉链法解决hash碰撞。

哈希表是由链表+数组组成。

通过hash(key)%len存储到相对应的数组中,如140%16=12意味着数组下标相同,并不表示hashCode相同。

java 中的 HashMap 是“数组+链表“结构,通过 key 计算出 hash 值,然后通过 hash 值算出数组下标。数组中的元素是一个链表,HashMap 的元素实际是存放在这个链表中的。

也就是说,通过在数组中创建一个链表,来解决哈希冲突。

另外,在 jdk18 中,链表长度大于 8 时,这个链表会转为“红黑树结构”。

设哈希表为hash[8],地址空间为hash[0]~hash[7]

76%7=6,76放入hash[6];

35%7=0,35放入hash[0];

27%7=6,此时hash[6]已有元素,后面的hash[7]为空,则27放入hash[7];

15%7=1,15放入hash[1];

41%7=6,此时hash[6]以及后面的7,0,1都有元素,则41放入hash[2];

44%7=2,此时hash[2]已有元素,后面的hash[3]为空,则44放入hash[3];

12%7=5,hash[5]=12;

可见,最终hash[4]仍是空的

以上就是关于hash碰撞解决办法全部的内容,包括:hash碰撞解决办法、hashmap怎么解决哈希冲突、哈希表长度是8,哈希函数H(key)=key%7,用线性探测再散列处理冲突有关键字(76、35、27、15、41、44、12)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10108009.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存