《我的第一本算法书》阅读笔记 1-6 哈希表原理图解
目录
普通数组线性查找工作流程
哈希表怎么存储数据
出现冲突怎么办?(eg.链地址法)
哈希表怎么查找数据
解说
补充说明
来源
在哈希表这种数据结构中,使用将在 5-3 节讲解的“哈希函数”,可以使数据的查询效率得到显著提升。
哈希表存储的是由键(key)和值(value)组成的数据。例如,我们将每个人的性别作为数据进行存储,键为人名,值为对应的性别。
为了和哈希表进行对比,我们先将这些数据存 储在数组中(数组的详细讲解在1-3 节)。
此处准备了 6 个箱子(即长度为 6 的数组)来存 储数据。假设我们需要查询Ally的性别,由于 不知道Ally的数据存储在哪个箱子里,所以只能从头开始查询。这个操作便叫作“线性查找”
普通数组线性查找工作流程
一般来说,我们可以把键当成数据的标识符,把值当成数据的内容
0号箱子中存储的键是Joe而不是Ally。
1号箱子中的也不是Ally.
同样,2号、3号箱子中的也都不是Ally。
查找到4号箱子的时候,发现其中数据的键为 Ally。把键对应的值取出,我们就知道 Ally 的性 别为女(F)了。
数据量越多,线性查找耗费的时间就越长。由此可知 :由于数据的查询较为耗时,所以此处并不适合使用数组来存储数据。
但使用哈希表便可以解决这个问题。首先准备好数组,这次我们用5个箱子的数组来存储数据。
哈希表怎么存储数据
尝试把Joe存进去。
使用哈希函数(Hash)计算 Joe的键,也就是字符串“Joe”的哈希值。得到的结果为4928
将得到的哈希值除以数组的长度5,求得其余 数。这样的求余运算叫作“mod 运算”。此处 mod运算的结果为3。
因此,我们将Joe的数据存进数组的3号箱子中。重复前面的操作,将其他数据也存进数组中。
Sue键的哈希值为7291,mod 5的结果为1, 将Sue的数据存进1号箱中。
Dan键的哈希值为1539,mod 5的结果为4, 将Dan的数据存进4号箱中。
出现冲突怎么办?(eg.链地址法)
Nell键的哈希值为6276,mod 5的结果为1。本应将其存进数组的1号箱中,但此时1号箱中已经存储了 Sue 的数据。这种存储位置重复了的情况便叫作“冲突”。
遇到这种情况,可使用链表在已有数据的后面 继续存储新的数据。关于链表的详细说明请见 1-2节。
Ally键的哈希值为9143,mod 5的结果为3。 本应将其存储在数组的3号箱中,但3号箱中已经有了Joe的数据,所以使用链表,在其后面存储Ally的数据。
Bob键的哈希值为5278,mod 5的结果为3。 本应将其存储在数组的3号箱中,但3号箱中 已经有了Joe和Ally的数据,所以使用链表, 在Ally的后面继续存储Bob的数据。
像这样存储完所有数据,哈希表也就制作完成了。
哈希表怎么查找数据
接下来讲解数据的查询方法。假设我们要查询 Dan的性别。
为了知道Dan存储在哪个箱子里,首先需要算出 Dan键的哈希值,然后对其进行mod运算。最后得 到的结果为4,于是我们知道了它存储在4号箱中。
查看 4 号箱可知,其中的数据的键与 Dan 一致, 于是取出对应的值。由此我们便知道了Dan的 性别为男(M)。
那么,想要查询Ally的性别时该怎么做呢?为 了找到它的存储位置,先要算出Ally键的哈希 值,再对其进行mod运算。最终得到的结果为3。
然而3号箱中数据的键是Joe而不是Ally。此 时便需要对Joe所在的链表进行线性查找。
于是我们找到了键为Ally的数据。取出其对应 的值,便知道了 Ally 的性别为女(F)。
解说
在哈希表中,我们可以利用哈希函数快速访问到数组中的目标数据。如果发生哈希 冲突,就使用链表进行存储。这样一来,不管数据量为多少,我们都能够灵活应对。
如果数组的空间太小,使用哈希表的时候就容易发生冲突,线性查找的使用频率也 会更高;反过来,如果数组的空间太大,就会出现很多空箱子,造成内存的浪费。因此, 给数组设定合适的空间非常重要。
补充说明
在存储数据的过程中,如果发生冲突,可以利用链表在已有数据的后面插入新数据 来解决冲突。这种方法被称为“链地址法”。
除了链地址法以外,还有几种解决冲突的方法。其中,应用较为广泛的是“开放地址法”。这种方法是指当冲突发生时,立刻计算出一个候补地址(数组上的位置)并将数据存进去。如果仍然有冲突,便继续计算下一个候补地址,直到有空地址为止。可以通过多次使用哈希函数或“线性探测法”等方法计算候补地址。
另外,本书在 5-3 节关于哈希函数的说明中将会提到“无法根据哈希值推算出原值” 这个条件。不过,这只是在把哈希表应用于密码等安全方面时需要留意的条件,并不是使用哈希表时必须要遵守的规则。
因为哈希表在数据存储上的灵活性和数据查询上的高效性,编程语言的关联数组等也常常会使用它。
来源
《我的第一本算法书》 [日]石田保辉 宫崎修一/著 张贝/译
《我的第一本算法书》阅读笔记 1-6 哈希表原理图解相关推荐
- 【我的第一本算法书】笔记
此笔记仅为我本人学习过程中记录的个人理解,欢迎交流. 如何选择算法 我们最为重视的是算法的运行时间,即从输入数据到输出结果的过程所花费的时间 时间复杂度是一个可以描述算法运行时间的函数,常用大O符号来 ...
- 我的第一本算法书--读书笔记
序–算法的基本知识 1.什么是算法 计算或解决问题的步骤. 算法和程序的区别 程序是以计算机能够理解的编程语言编写的,算法是以人能够理解的方式描述. 排序 排列整数的算法 选择排序 查找最小的数字并交 ...
- 《我的第一本算法书》阅读笔记 6-2 k-means 算法
1 什么是聚类 1.1 将相似的对象分为一组 聚类就是在输入为多个数据时,将"相似"的数据分为一组的操作.1 个组就叫作 1 个 "簇".下面的示例中每个点都代 ...
- 《我的第一本算法书》阅读笔记 1-8 二叉查找树
目录 二叉查找树性质 插入数据--插入1 插入数据--插入4 删除节点--节点无子结点的情况 删除节点--有一个字节点的情况 删除节点--节点有子树的情况 查找结点 解说 补充说明 来源 二叉查找树( ...
- 算法基础--《我的第一本算法书》--(算法学习一)
根据<我的第一本算法书>做的学习笔记,刚刚接触,里面根据自己的理解做的有删减,欢迎留言交流. 插图索引 图1.1 链表结构... 4 图1.2 数组概念图. ...
- 造球粒径检测算法论文阅读笔记
造球粒径检测算法论文阅读笔记 1.图像感兴趣区域的划分 2.生球区图像高斯滤波 3.生球区域与阴影区域的分割 4.对生球区域的分类标记(区分上下层球) 1.图像感兴趣区域的划分 依据光照的不同,将图像 ...
- 【数据结构与算法篇】 哈希表原理、底层实现剖析
一个在校大二学生,在CSDN记录自我成长!!!最近在自学数据结构和算法时,学到了哈希表,有很多地方都不明白.如何使用哈希表?原理是什么?如何工作的?我们如何设计哈希表?等等,所以就在网络上查了相关博客 ...
- 【计算机视觉】运动目标检测算法文献阅读笔记
先前在博客中对常见的运动目标检测算法有写过一篇总结,详情请参考:http://blog.csdn.NET/kezunhai/article/details/8830787.本文是在校期间写的部分阅读笔 ...
- 《Rigging the Lottery》 RigL算法 论文阅读笔记
Rigging the Lottery: Making All Tickets Winners authors: Utku Evci Trevor Gale Jacob Menick Pablo Sa ...
最新文章
- 阿里云配置服务器报:bind: cannot assign requested address
- LOJ.2587.[APIO2018]铁人两项Duathlon(圆方树)
- 十年WEB技术发展历程
- 在.net 2.0 中执行分布式事务:隐式事务篇(SQL Server 与 Oracle)
- linux查看程序写文件内容,Linux 文件内容查看命令
- 深入解析ES6中let和闭包
- 地理空间数据Geometry在MySQL中使用(一)
- 软件测试--缺陷报告常见问题03
- 【转】Javabyte[]数组和十六进制String之间的转换Util------包含案例和代码
- 26. Postpone variable definitions as long as possible
- VGG16-keras 优化
- 国际象棋小麦python_python图形工具turtle绘制国际象棋棋盘
- bzoj 2818 欧拉函数
- 走进tensorflow第九步——WARNING(警告)也值得关注
- STM32 HAL库获取系统时钟与标准库获取系统时钟
- 将C盘的软件已经移到了D盘,为什么C盘还是会出现变红或饱满的状态?
- Quartus-II的安装教程
- Google Earth Engine(GEE)对比显示不同城市的地表温度
- Linux小白详细笔记
- 项目范围管理计划模板