算法笔记 10 散列表

微信公众号:珷玞的日常

基础

散列表用的是数组支持下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。通过散列函数将元素的键值映射为下标,然后将数据存储在数组对应下标的位置。我们按照键值查询元素时,我们使用同样的散列函数,将键值转化为数组下标,从对应的数组下标位置取数据。

散列函数

散列函数的基本要求:

  1. 散列函数计算得到的散列值必须是一个非负整数

  2. key1 == key2 时,hash(key1) == hash(key2)

  3. key1 != key2 时,hash(key1) != hash(key2)

也正是由于第三点几乎是不可能完成的,所以会造成散列冲突

解决散列冲突的两种方法

1.开放寻址法

基本思想:如果出现了散列冲突,就重新探测一个空闲位置,将其插入。

过程:以线性探测为例,当我们往散列表插入数据,如果某个数据经过 hash 函数后,存储位置已经被占用,就从当前位置开始,依次往后查找,看是有空闲位置,直到找到为止。

在有限的空间内,如果查找到数组的最后一个找不到空闲位置,再从开头向后寻找。

查找:使用开放寻址法进行插入操作,先通过 hash 函数找到查找元素的键值对应的散列值,然后比较数组中下标为散列值的元素和要查找的元素。如果相等,那么就说明是我们要找的元素;否则就顺序往下找。

如果是我们找到的空闲位置是我们通过删除得到的,我们会将这个位置标记为 deleted,当线性探测时,遇到标记为 deleted 的空间,继续探测。

问题:当插入数据越来越多的时候,散列冲突可能性就越大,空间位置越来越少,线性探测时间越来越长,当删除和查找的时候,时间也变长了。

2.链表法

这是一种常用的散列冲突解决方法,基本思想是将 hash 函数计算出的散列值位置对应一条链表

这种方法,插入和删除一个元素的时间复杂度和链表的长度 k 成正比,为 O(k)。

散列表实例

Word 文档中单词拼写检查功能如何实现?

将常用英文单词存储在一个散列表中,当用户输入某个单词,用单词到散列表中查找。如果查到,说明拼写成功;反之,拼写可能有错误,返回提示。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值