数据结构-哈希表

一、什么是哈希表?

1.1 认识哈希表

在这里插入图片描述
在开始了解哈希表之前,我们先来看一下数组的优缺点:

  1. 数组进行 插入 操作时, 效率低
  2. 数组进行删除操作时,效率低
  3. 数组进行 查找 操作:
    3.1 如果基于 索引 进行查找操作时, 效率非常高
    3.2 基于内容去查找,比如(name=“why”),效率则非常

综上所述,其实我们不难看出,数组其实效率比较低,那么我们可不可以提高它的效率呢,答案是可以的,我们的前辈们就完成了这样一种伟大的发明(哈希表的由来),哈希表是基于数组去实现的

接下来我们通过三个案例来充分认识哈希表的优势。

1.2 案例一 公司员工存储

在这里插入图片描述.在这里插入图片描述

1.3 案例二 联系人与电话存储

在这里插入图片描述在这里插入图片描述

1.4 案例三 50000个单词存储

在这里插入图片描述

二、字母转数字的方案

似乎所有的案例都指向了一目标:将字符串转成下标值

但是,怎样才能将一个字符串转成数组的下标值呢

单词/字符串转下标值,其实就是字母/文字转数,怎么转

现在我们需要设计一种方案可以将单词转成适当的下标。

其实计算机中有很多的编码方案就是用数字代替单词的字符。就是字符编码。(常见的字符编码?)
比如ASCII编码:a是97,b是98,依次类推122代表z

我们也可以设计一个自己的编码系统比如a是1,b是2,c是3,依次类推,z是26.当然我们可以加上空格用0代替,就是27个字符(不考虑大写问题)
但是,有了编码系统后,一个单词如何转成数字呢?

2.1 方案一

在这里插入图片描述

2.2 方案二

在这里插入图片描述
这里我们选择改进第二种方案,改进的过程就叫做: 哈希化

三、哈希表

在了解哈希表之前,我们需要知道何为哈希化?
在这里插入图片描述
认识情况了上面的内容,相信你应该懂了哈希表的原理了,我们来看看几个概念。

  • 哈希化:将大数字转化成数组范围内下标的过程,我们就称之为哈希化
  • 哈希函数:通常我们会将单词转成大数字大数字在进行哈希化的代码实现放在一个函数中,这个函数我们称为哈希函数
  • 哈希表:最终将数据插入到的这个数组,对整个结构的封装,我们就称之为是一个哈希表

但是,我们还有问题需要解决
虽然,我们在一个100000的数组中,放50000个单词已经足够

但是通过哈希化后的下标值依然可能会重复如何解決这种重复的问题呢?

3.1 哈希化之后产生的 冲突

在这里插入图片描述
两种解决方案:

  1. 链地址法
  2. 开放地址法

3.2 深入 链地址法(拉链法)

在这里插入图片描述
以前的位置不在是单独的存放数据了,而是创造一个数组或者链表,把数据放入里边,如果之后再次产生了冲突,则依次放入链表或者数组。
在这里插入图片描述

3.3 开放地址法

在这里插入图片描述

3.4 开放地址法——线性探测

3.4.1 什么是线性探测?

在这里插入图片描述

3.4.2 线性探测的问题——删除、插入、聚集

在这里插入图片描述

3.5 开放地址法——二次探测

在这里插入图片描述

3.6 开放地址法——再哈希法

在这里插入图片描述

stepSize = constant - (key % constant)
注:constant是质数(除1和本事外,不能被整除的数),且constant小于数组容量
在这里插入图片描述
由此得出,哈希表的容量最好也是 质数

3.7 哈希化的效率

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.8 优秀的哈希表

在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优雅哥cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值