数据结构与算法五:哈希表-哈希函数设计原则-哈希冲突解决方案

一、哈希表的定义:
在这里插入图片描述
二、哈希表举例:
哈希函数就是映射关系
在这里插入图片描述
三、哈希表应用举例:
Leetcode上第387题:
在这里插入图片描述
思路:通过s.charAt(i)-'a’将字符串中的字符映射成hash表,出现一次,在相应位置加一,左后找到第一个值为1的下标
其他思路:当然此题解决方案很多,如一位一位的遍历亦可以

在这里插入图片描述

四、哈希函数:

  • 将业务场景中的键转化为索引的过程称为哈希表的核心
  • 即使再优秀的哈希表也保证不了一个键对应一个不同的索引,这就是哈希冲突
  • 哈希函数设计原则:一致性(equals相等这hash值相等)、高效性(简单高效)、均匀性(尽可能使得hash值分布均匀)
  • 哈希表体现了空间换时间的原理

为了降低哈希冲突,需要采用大于实际存储数据数量的哈希表,这就是空间换时间的原理。

五、常见哈希函数:
1.整型
小整数:

  • 小正整数:直接使用;如0-9
  • 小负整数:偏移成正整数再使用;如-10-0可以先加10再使用

大整数:

  • 大整数取部分:如复杂的学号20210917141122,如果直接使用需要20210917141122长的哈希表,取部分,如17141122则可以节省很大的空间。

  • 大整数对m取模:m的值很重要,一般是质数取模,哈希冲突的概率小

质数是除了1与自身之外没有其他约数的自然数;0与1既不是质数也不是合数

业内总结数值区间与最优取模值,如下:
在这里插入图片描述
2.浮点型
转化为整数即可
在这里插入图片描述
3.字符串
通过直接转换或者B进制数,转化为整数即可
在这里插入图片描述

如果B很大可以每一项都先取模:
在这里插入图片描述
3.引用数据类型
可以让其中的成员变量各自哈希得出;
Java中的hashCode(),为我们计算string类型的hash值;
在这里插入图片描述
六、哈希冲突处理方法:

再完美的hash算法也不可能避免hash冲突,因此需要有处理hash冲突的方法;

1.链地址法(常用):
hashMap、hashSet底层均是散列表;其解决hash冲突的方式就是链地址法;
在这里插入图片描述
2.开发地址法:
如果遇到hash冲突,开放地址法有四种处理方案:
线性探测法:冲突时,就去存相邻位置,以此类推
平方探测法:冲突时,进行平方找位置,以此类推
再哈希法: 再次用其他的hash算法,进行一次或多次hash
合理扩容: 为了较少hash冲突可进行适当扩容
在这里插入图片描述
数据结构与算法更多相关内容【持续更新中】:

  • 【数据结构与算法一:时间频度和时间复杂度】: 传送门.
  • 【数据结构与算法二:数组】: 传送门.
  • 【数据结构与算法三:栈和队列】: 传送门.
  • 【数据结构与算法四:链表】: 传送门.
  • 【数据结构与算法五:哈希表-哈希函数设计原则-哈希冲突解决方案】: 传送门.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值