目录

普通数组线性查找工作流程

哈希表怎么存储数据

出现冲突怎么办?(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 哈希表原理图解相关推荐

  1. 【我的第一本算法书】笔记

    此笔记仅为我本人学习过程中记录的个人理解,欢迎交流. 如何选择算法 我们最为重视的是算法的运行时间,即从输入数据到输出结果的过程所花费的时间 时间复杂度是一个可以描述算法运行时间的函数,常用大O符号来 ...

  2. 我的第一本算法书--读书笔记

    序–算法的基本知识 1.什么是算法 计算或解决问题的步骤. 算法和程序的区别 程序是以计算机能够理解的编程语言编写的,算法是以人能够理解的方式描述. 排序 排列整数的算法 选择排序 查找最小的数字并交 ...

  3. 《我的第一本算法书》阅读笔记 6-2 k-means 算法

    1 什么是聚类 1.1 将相似的对象分为一组 聚类就是在输入为多个数据时,将"相似"的数据分为一组的操作.1 个组就叫作 1 个 "簇".下面的示例中每个点都代 ...

  4. 《我的第一本算法书》阅读笔记 1-8 二叉查找树

    目录 二叉查找树性质 插入数据--插入1 插入数据--插入4 删除节点--节点无子结点的情况 删除节点--有一个字节点的情况 删除节点--节点有子树的情况 查找结点 解说 补充说明 来源 二叉查找树( ...

  5. 算法基础--《我的第一本算法书》--(算法学习一)

    根据<我的第一本算法书>做的学习笔记,刚刚接触,里面根据自己的理解做的有删减,欢迎留言交流. 插图索引 图1.1         链表结构... 4 图1.2         数组概念图. ...

  6. 造球粒径检测算法论文阅读笔记

    造球粒径检测算法论文阅读笔记 1.图像感兴趣区域的划分 2.生球区图像高斯滤波 3.生球区域与阴影区域的分割 4.对生球区域的分类标记(区分上下层球) 1.图像感兴趣区域的划分 依据光照的不同,将图像 ...

  7. 【数据结构与算法篇】 哈希表原理、底层实现剖析

    一个在校大二学生,在CSDN记录自我成长!!!最近在自学数据结构和算法时,学到了哈希表,有很多地方都不明白.如何使用哈希表?原理是什么?如何工作的?我们如何设计哈希表?等等,所以就在网络上查了相关博客 ...

  8. 【计算机视觉】运动目标检测算法文献阅读笔记

    先前在博客中对常见的运动目标检测算法有写过一篇总结,详情请参考:http://blog.csdn.NET/kezunhai/article/details/8830787.本文是在校期间写的部分阅读笔 ...

  9. 《Rigging the Lottery》 RigL算法 论文阅读笔记

    Rigging the Lottery: Making All Tickets Winners authors: Utku Evci Trevor Gale Jacob Menick Pablo Sa ...

最新文章

  1. 阿里云配置服务器报:bind: cannot assign requested address
  2. LOJ.2587.[APIO2018]铁人两项Duathlon(圆方树)
  3. 十年WEB技术发展历程
  4. 在.net 2.0 中执行分布式事务:隐式事务篇(SQL Server 与 Oracle)
  5. linux查看程序写文件内容,Linux 文件内容查看命令
  6. 深入解析ES6中let和闭包
  7. 地理空间数据Geometry在MySQL中使用(一)
  8. 软件测试--缺陷报告常见问题03
  9. 【转】Javabyte[]数组和十六进制String之间的转换Util------包含案例和代码
  10. 26. Postpone variable definitions as long as possible
  11. VGG16-keras 优化
  12. 国际象棋小麦python_python图形工具turtle绘制国际象棋棋盘
  13. bzoj 2818 欧拉函数
  14. 走进tensorflow第九步——WARNING(警告)也值得关注
  15. STM32 HAL库获取系统时钟与标准库获取系统时钟
  16. 将C盘的软件已经移到了D盘,为什么C盘还是会出现变红或饱满的状态?
  17. Quartus-II的安装教程
  18. Google Earth Engine(GEE)对比显示不同城市的地表温度
  19. Linux小白详细笔记
  20. 项目范围管理计划模板

热门文章

  1. 【奥卡姆剃刀】一条短信骗走所有财产的分析
  2. 亲测可用,利用Python实现自动抢课脚本
  3. MES计件工资——实现工资精准计算的重要工具
  4. 复星联合创始人梁信军:谁掌握了海量区块链账户,谁就是赢家
  5. 郭光灿院士--奇妙的量子世界笔记1(量子世界和经典世界区联系)
  6. 基于微信小程序的在线花店的设计开发
  7. js 利用canvas转换图片格式并下载图片
  8. 中国「本土」供应商出位,智能驾驶域控制器TOP10榜单发布
  9. blude关注+私信脚本引流使用教程
  10. linux 压缩文件解压到到指定的目录