
在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)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)