HashMap——散列函数与哈希冲突

table数组中,一个entry数据结构对应一条链表,也就是一个哈希桶,有相同hash值的存放在一条链表上,不同hashcode返回值区分链表上的键值对。
为了防止单链表的产生,要正确的选择散列函数

散列函数:映射地址的函数,有几种方式

1.直接定址法:选择某个关键字key的线性函数得到的地址作为散列地址
2.除留取余法:关键字除以某个比散列表长度小的素数得到的余数作为散列地址
3.平均取中法:关键字平方后,根据散列表大小取中间的几位作为散列地址
4.折叠法:将关键字分为若干组位,每一组的位数由散列表大小决定,最后一组可以短一些补零,把这些位数相加得到散列地址
5.随机数法:选择一个随机函数,用关键字的随机函数得到的值作为散列地址
6.数学分析法:分析关键字的各个位数,每个位会出现若干种不同的符号,选择符号易于区分开并且分布均匀的位作为散列地址

当不同的key落到相同的散列地址时,会发生冲突,也就是哈希冲突
冲突避免方法:

一、.开放地址法

Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)
其中m为表长,di为增量序列

1.线性探测
如果di值可能为1,2,3,…m-1,称线性探测再散列。
即检测下一地址是否可以插入,如果可以就放入下一地址,如果不可以继续向下一地址检测

2.二次探测
如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,…kk,-kk(k<=m/2),称二次探测再散列。
因为线性探测插入的key值太集中,这样key值很难存放到映射的散列地址上

二、哈希桶 开链法
有相同散列地址的key-value构成一个链表,也就是哈希桶
可以将单链表变为红黑树提高效率(?)
在这里插入图片描述

ps:素数表作为哈希表的长度可以降低哈希冲突

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值