散列表(如何解决哈希冲突)

博客为极客时间-数据结构和算法之美的总结

散列表是什么就详细解释了,说一下散列表得三个基本要求吧

散列函数三点基本要求
1 散列函数计算得到得散列值是一个非负整数
2 如果key1=key2,那个hash(key1)==hash(key2);
3 如果key1不等于key2,那么hash(key1)不等于hash(key2)

如何解决哈希冲突

1 开放寻址法

开放寻址得核心思想是,如果出现散列冲突,我们就重新探测一个空闲位置,将其插入而如何查找新的位置 

开放寻址方法一:线性探测

当我们往散列表中插入数据时,如果某个数据经过hash后,发现存储位置已经被占用,我们就从当前位置开始,依次往后查找,看是否有空闲位置,知道找到位置

黄色表示空闲位置,橙色表示已经存储了数据,如下,原来为7,7被占用,则找到了位置2  (查找得过程和插入类似,根据值查找位置,删除有些例外 这里就不详细说明,详细请查看-数据结构和算法之美专栏)

线性探测法得缺点:如果散列表插入得数据越来越多时,散列冲突发生得可能性越来越大,空闲位置越来越少。线性探测得时间就会越来越久,极端情况下我们可能需要探测整个散列表,所以最坏得情况下得时间复杂度为O(n),同理,在删除和查找时,也有可能会线性探测到整张散列表,才能找到要查找或者删除的数据

开放寻址方法二:二次探测

所谓二次探测,跟线性探测很像,线性探测每次探测得步长为1,那它探测得下标序列就hash(key)+0,hash(key)+1,hash(key)+2,而二次探测得补偿就变成了原来得二次方,比如hash(key)+1^2,hash(key)+2^2

开放寻址方法三:双重散列

所谓双重散列,意思就是不仅要使用一个散列函数,我们要使用一组散列函数hash1(key),hash2(key),hash3(key),我们先用第一个散列函数,如果找到得位置被占用,再找第二个散列函数,一次类推,找到空闲位置为止

不管采用那种探测方法,当散列表中空闲位置不多时得时候,散列表冲突得概率就会大大提高,为了尽可能保证散列表得操作效率,一般情况下,我们会尽可能得保证散列表中有一定比列得空闲槽位,我们用装载因子(load factor)表示空位得多少

装载因子得计算公式是:  散列表得装载因子=填入表中得元素个数/散列表得长度

装载因子越大,说明空闲位置越少,散列表得性能会下降

2 链表法

链表法是一种更加常用得散列冲突解决办法,相比开放寻址法,它要简单得多

当插入得时候,我们只需要通过散列函数计算出对应得散列槽位,将其插入到对应得链表中即可,所以时间复杂度位O(1)

查找和删除两个得时间复杂度跟链表得长度K成正比,也就是O(K),对于散列表比较均与得散列函数,李坤上将k=n/m.其中n表示散列中数据得个数,m表示散列表中槽的个数

扩展1:word文档中单词拼写如何实现

常用得英文单词有20w个左右,假设单词得平均长度是10个字母,平均一个单词占用10个字节得内存空间,那20w也才2MB左右,就算扩大10倍也才20MB.对于现在得计算机来说,这个大小完全可以放在内存里面,所以我们可以用散列表来存储整个英文单词词典,当用于输入某个英文单词得时候,我们拿用户输入得单词去散列表中查找,如果查到,则说明拼写正确,如果没有查找到,则说明查找可能有误

给与提示,借助散列表这种数据结构,我们就可以轻松实现快速判读是否存在拼写错误

扩展2:假设我们有10w条url访问日志,如何按照访问次数给url排序

遍历 10 万条数据,以 URL 为 key,访问次数为 value,存入散列表,同时记录下访问次数的最大值 K,时间复杂度 O(N)。如果 K 不是很大,可以使用桶排序,时间复杂度 O(N)。如果 K 非常大(比如大于 10 万),就使用快速排序,复杂度 O(NlogN)

扩展3:有两个字符串数组,每个数组大约有10w条字符串,如何快速找到两个数组中相同得字符串

将一个字符串数组作为一个散列表,然后用另一个字符串数组得查找,如果有则找到,没有位NULL

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值