当前位置:网站首页>哈希表(Hash Tabel)
哈希表(Hash Tabel)
2022-07-04 20:36:00 【Wu_Candy】
这是无量测试之道的第163篇原创
面试的时候,曾被问过:你知道字典的底层数据结构是什么吗?
那我们今天主要讲的就是哈希表这种数据结构到底是什么样子的;哈希碰撞是怎么造成的以及是如何解决哈希碰撞的。
1.定义
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做哈希表。
字典存值案例如下代码。为了能比较通俗的理解哈希表这种数据结构,我们先看下图:
put("jack","666")
put("Rose","777")
put("Evan","888")
Hash Table主要由2部分组成:
- 哈希函数
- Table 「 底层是一个数组,一般数组大小是2n 」至于为什么是这样,是为了位运算的方便
Hash函数和Table的作用
hash函数的主要作用是将key进行操作,生成一个整数的索引值index。对应我们的案例:
hash("Jack") --> index = 14
hash("Rose") --> index = 01
hash("Evan") --> index = 03
然后根据index将对应的value存储到Table数组中。从而完成key和value的映射。
2.Hash碰撞
我们往字典里面再加入一组数据(Jeffery,999)
,假设hash("Jeffery") --> index = 03
,此时就会发现,Jeffery和Rose的index都为3,冲突了,这就是Hash碰撞。
3.解决Hash碰撞
解决Hash冲突的常见方法:
- 1. 开放定址法(Open Addressing):按照一定规则向其他地址探测,直到遇见空的位置
- 2. 再哈希法(Rr-Hashing)“设计多个hash函数
- 3. 链地址法(Separate Chaining)比如通过链表将同一index的元素串起来
今天主要要介绍的是链地址法,当发现hash碰撞的时候,可以使用单链表将同一index的元素串起来,如下图所示:
4.如何生存key的哈希值?
key常见的种类可能有:整数、浮点数、字符串、定义对象。 不同种类的key,哈希值的生成方式不一样,但是目标是一致的:
- 1. 尽量让每个key的哈希值是唯一的
- 2. 尽量让key的所有信息参与运算
本文的key都为字符串,以jack为例:jack的哈希值可以表示为:j * n^3 + a * n^2 + c * n^1 + k * n^0
jack
的ASCII都是可查的,所以通过上述计算可以得到一个整数T,然后通过与Table数组的大小进行&位运算
或者%去余运算
,就可以得到inedx下标值。
关于整数、浮点数、定义对象的哈希值的计算方式,大家感兴趣的话可以去搜索一下,有比较系统的讲解。
总结
今天主要介绍了哈希表这种数据结构到底是怎样存值的,紧接着讲解了哈希碰撞是怎么产生的以及是如何解决的,最后介绍了字符串key的的哈希值的计算方式。相信大家认真看完本文,对哈希表到底是什么有了一个比较清晰的认识。
边栏推荐
- Google colab踩坑
- Stealing others' vulnerability reports and selling them into sidelines, and the vulnerability reward platform gives rise to "insiders"
- The video sound of station B is very low - solution
- Configuration of DNS server of Huawei ENSP simulator
- 杰理之AD 系列 MIDI 功能说明【篇】
- Delphi SOAP WebService 服务器端多个 SoapDataModule 实现相同的接口方法,接口继承
- TCP shakes hands three times and waves four times. Do you really understand?
- 吐槽 B 站收费,是怪它没钱么?
- Go语言循环语句(第10课中3)
- minidom 模块写入和解析 XML
猜你喜欢
华为模拟器ensp的路由配置以及连通测试
Jerry's ad series MIDI function description [chapter]
admas零件名重复
TCP shakes hands three times and waves four times. Do you really understand?
杰理之增加进关机前把触摸模块关闭流程【篇】
Maya lamp modeling
Introduction to pressure measurement of JMeter
应用实践 | 蜀海供应链基于 Apache Doris 的数据中台建设
输入的查询SQL语句,是如何执行的?
【公开课预告】:视频质量评价基础与实践
随机推荐
Daily question-leetcode556-next larger element iii-string-double pointer-next_ permutation
【C語言】符號的深度理解
面试官:说说XSS攻击是什么?
Day24:文件系统
Delphi soap WebService server-side multiple soapdatamodules implement the same interface method, interface inheritance
y56.第三章 Kubernetes从入门到精通 -- 业务镜像版本升级及回滚(二九)
【optimtool.unconstrain】无约束优化工具箱
[wechat applet] collaborative work and release
redis布隆过滤器
redis发布订阅的使用
WGCNA分析基本教程总结
Introduction to pressure measurement of JMeter
Delphi SOAP WebService 服务器端多个 SoapDataModule 实现相同的接口方法,接口继承
The video sound of station B is very low - solution
shp数据制作3DTiles白膜
Use of class methods and class variables
奋斗正当时,城链科技战略峰会广州站圆满召开
类方法和类变量的使用
Jerry's ad series MIDI function description [chapter]
如何借助自动化工具落地DevOps