Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >什么是散列表(哈希表)?

什么是散列表(哈希表)?

作者头像
编程珠玑
发布于 2019-07-12 06:10:55
发布于 2019-07-12 06:10:55
6500
举报
文章被收录于专栏:编程珠玑编程珠玑

前言

假设你们班级100个同学每个人的学号是由院系-年级-班级和编号组成,例如学号为01100168表示是1系,10级1班的68号。为了快速查找到68号的成绩信息,可以建立一张表,但是不能用学号作为下标,学号的数值实在太大。因此将学号除以1100100取余,即得到编号作为该表的下标,那么,要查找学号为01100168的成绩的时候,只要直接访问表下标为68的数据即可。这就能够在O(1)时间复杂度内完成成绩查找。

实际上这里就用到了散列的思想。本文重在介绍散列的思想以及散列需要考虑的问题。

散列表(哈希表)

理想散列表(哈希表)是一个包含关键字的具有固定大小的数组,它能够以常数时间执行插入,删除和查找操作

  • 每个关键字被映射到0到数组大小N-1范围,并且放到合适的位置,这个映射规则就叫散列函数
  • 理想情况下,两个不同的关键字映射到不同的单元,然而由于数组单元有限,关键字范围可能远超数组单元,因此就会出现两个关键字散列到同一个值得时候,这就是散列冲突

实例演示

通过前面的描述,我们已经了解了一些基本概念,现在来看一个实例。 假设有一个大小为7的表,现在,要将13,18,19,50,20散列到表中。

  • 选择散列函数,例如使用hash(x)=x%7作为散列函数
  • 计算数据散列值,并放到合适的位置

计算13 % 7得到6,因此将13放到下标为6的位置:

0

1

2

3

4

5

6

13

计算18 % 7得到4,因此将18放到下标为4的位置:

0

1

2

3

4

5

6

18

13

计算19 % 7得到5,因此将19放到下标为5的位置:

0

1

2

3

4

5

6

18

19

13

计算50 % 7得到1,因此将50放到下标为1的位置:

0

1

2

3

4

5

6

50

18

19

13

计算20 % 7得到6,因此将20放到下标为6的位置,但是此时6的位置已经被占用了,因此就产生了散列冲突,关于散列冲突的解决,我们后面再介绍。

将数据散列之后,如何从表中查找呢?例如,查找数值为50的数据位置,只需要计算50 % 7,得到下标1,访问下标1的位置即可。但是如果考虑散列冲突,就没有那么简单了。

通过这个实例,了解了以下几个概念:

  • 散列函数,散列函数的选择非常重要
  • 散列冲突,涉及散列表时,因尽量避免散列冲突,对于冲突也要有好的解决方案
  • 快速从散列表中查找数据

冲突解决

解决散列冲突通常有以下几种方法:

  • 拉链法
  • 开放定址法
  • 再散列
拉链法

分离链接法的做法是将同一个值的关键字保存在同一个表中。例如,对于前面:

0

1

2

3

4

5

6

50

18

19

13

如果再要插入元素20,则在下标为6的位置存储表头,而表的内容是13和20。

这种方法的特点是需要另外分配新的单元来存储散列到同一个位置的数据。

查找的时候,除了根据计算出来的散列值找到对应位置外,还需要在链表上进行搜索。而在单链表上的查找速度是很慢的。另外散列函数如果设计得好,冲突的概率其实也会很小

开放定址法

而开放定址法的思想是,如果冲突发生,就选择另外一个可用的位置

而开放定址法中也有常见的几种策略。

  • 线性探测法

还是以前面的为例:

0

1

2

3

4

5

6

50

18

19

13

如果此时再要插入20,则20 % 7 = 6,但是6的位置已有元素,因此探测下一个位置(6+1)%7,在这里就是下标为0的位置。因此20的存储位置如下:

0

1

2

3

4

5

6

20

50

18

19

13

但这种方式的一个问题是,可能造成一次聚集,因为一旦冲突发生,为了处理冲突就会占用下一个位置,而如果冲突较多时,就会出现数据都聚集在一块区域。这样就会导致任何关键字都需要多次尝试才可能解决冲突。

  • 平方探测法

顾名思义,如果说前面的探测函数是F(i)= i % 7,那么平方探测法就是F(i)= (i^2 )% 7。 但是这也同样会产生二次聚集问题。

  • 双散列

为了避免聚集,在探测时选择跳跃式的探测,即再使用一个散列函数,用来计算探测的位置。假设前面的散列函数为hash1(X),用于探测的散列函数为hash2(X),那么一种流行的选择是F(i) = i * hash2(X),即第一次冲突时探测hash1(X)+hash2(X)的位置,第二次探测 hash1(X)+2hash2(X)的位置。

可以看到,无论是哪种开放定址法,它都要求表足够大。

再散列

我们前面也说到,散列表可以认为是具有固定大小的数组,那么如果插入新的数据时散列表已满,或者散列表所剩容量不多该怎么办?这个时候就需要再散列,常见做法是,建立一个是原来两倍大小的散列表,将原来表中的关键字重新散列到新表中。

散列表的应用

散列表应用很广泛。例如做文件校验或数字签名。当然还有快速查询功能的实现。例如,redis中的字典结构就使用了散列表,使用MurmurHash算法来计算字符串的hash值,并采用拉链法处理冲突,,当散列表的装载因子(关键字个数与散列表大小的比)接近某个大小时,进行再散列

总结

一个设计良好的散列表能够几乎在O(1)时间复杂度内完成插入,删除和查找,但前提是散列函数设计得足够优雅,以及有着合适散列冲突解决方案。常见冲突解决方案有:

  • 拉链法
  • 开放地址检测法

其中拉链法在实际中是很常见的一种解决方案。另外本文重点说明什么是散列表(哈希表),因此没有涉及具体的代码,后面将会通过实例来看散列表的实际应用。

参考

数据结构与算法分析》 《redis设计与实现》 https://en.wikipedia.org/wiki/Hash_table

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
20191124_射雕侠侣和天龙八部小说分类
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157858.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/14
5100
国人当自强 | 中国古代的“机器人梦”,带你看看祖先们的机械智慧
今天,机器人可以被设计、制作,为人类服务。而在中国,古代人早就有“机器人梦”,梦想着能制作一种形态像人的物件来代替人类劳动。为这个梦想,中国人制作出了能够自己活动的机械装置,可以被视为现代机器人的鼻祖。 春秋后期,鲁班曾经制造过一只能在空中自由飞行的木鸟,“三日不下”。三国时期的蜀汉,为了运送粮食,著名军事家诸葛亮发明了木制的带有晃动货箱的人力步行式运输器具——木牛流马,虽然其样貌不明,却被称为最早的陆地军用机器人。 虽然这都是些简易的装置,可是它们也都有着自己的动力来源。据史料记载,今天可知的我国古代机器
机器人网
2018/04/23
4.4K0
国人当自强 | 中国古代的“机器人梦”,带你看看祖先们的机械智慧
国际机器人与自动化大会重点推介的20种创新机器人技术
最近在瑞典斯德哥尔摩召开的“国际机器人与自动化大会”(ICRA)向世人展示了该领域最新的设计和创意理念,从飞行运输、环保检测、工业制造到休闲生活娱乐,形形色色的机器人几乎覆盖了生产生活的各个领域。 不过,外行看热闹,内行看门道。美国电气与电子工程师协会(IEEEE)《光谱》杂志从专业角度,介绍了会展中的20种机器人技术,设计重点在于以创新方案解决目前机器人应用中的一些难题,主要集中在控制、传感、驱动、操作、抓握、义肢、人形机平衡、外骨骼、飞行取物、人工智能、虚拟现实、组织微型机器人团队等方面。 1.以视觉触
机器人网
2018/04/23
1.2K0
国际机器人与自动化大会重点推介的20种创新机器人技术
工业机器人的运行结构
手臂是机器人执行机构中重要的部件,它的作用是将抓取的工件运送到给定的位置上, 因而一般机器人的手臂有3个自由度,即手臂的伸缩、左右回转和升降(或俯仰)运动。手 臂回转和升降运动是通过机座的立柱实现的,立柱的横向移动即为手臂的横移。手臂的各种 运动通常由驱动机构和各种传动机构来实现,因此它不仅仅承受被抓取工件的重量,而且承 受末端执行器、手腕和手臂自身的重量。手臂的结构、工作范围、灵活性以及抓重大小(即 臂力)和定位精度都直接影响机器人的工作性能,所以必须根据机器人的抓取重量、运动形 式、自由度数、运动速度以
机器人网
2018/04/24
1.3K0
工业机器人的运行结构
机器人
带着AI内核的机器人是未来科技发展的集大成者,可以说是下一个技术奇点的标志性产物。“机器人革命”有望成为“第三次工业革命”的一个切入点和重要增长点,国际机器人联合会预测,“机器人革命”将创造数万亿美元的市场。很多人都认为,机器人是“制造业皇冠顶端的明珠”,其研发、制造、应用是衡量一个国家科技创新和高端制造业水平的重要标志。
用户7623498
2021/12/04
7840
3000亿紫光集团管理层大换血,赵伟国时代落幕|镁客网每周硬科技领域投融资汇总(7.9-7.15)
7月13日,李滨首次发布员工信,宣布集团会设立三个总部,大力投入研发,并制定短、中、长期的业务和战略规划。‍ 作者 | 来自镁客星球的波点 本周硬科技领域投融资事件一共61起,人工智能领域发生32起融资事件,占比52%;半导体领域发生13起融资事件,占比21%;生物医药领域发生5起融资事件,占比8%;物联网领域发生4起融资事件,占比7%;航空航天、区块链领域各发生2起融资事件,分别占比3%。3R(VR/AR/MR)、新材料、新能源领域各发生1起融资事件,分别占比2%。 7月11日,紫光集团及下属公司发布公告
镁客网
2022/07/19
6530
3000亿紫光集团管理层大换血,赵伟国时代落幕|镁客网每周硬科技领域投融资汇总(7.9-7.15)
仿生巨头 Festo 为机械臂安上 AI ,习得技能立即同步所有机械臂
AI 科技评论按:每年以 2 - 3 件仿生机器人生产速度不停扩张仿生产品线的 Festo ,是一家德国自动化技术供应商,近年来以外观精巧夺目的仿生机器人频频登上科技新闻热搜榜。近日,由其发布的一款最新仿生产品——气动机械臂,更是引入了强化学习及大规模并行学习等 AI 技术,使得仿生机器人的技能习得与技能同步变得更加便捷。
AI科技评论
2019/05/08
7710
仿生巨头 Festo 为机械臂安上 AI ,习得技能立即同步所有机械臂
世界上最顶尖的技术在哪些国家?长知识了!
目前蚀刻设备精度最高的是日立。比如东丽,帝人的炭纤维,超高精密仪器,数控机床,光栅刻画机(这个最牛的也是日立,刻画精度达到10000g/mm ),光刻机(ASML)等等,这些是美日严格限制出口的。
用户1621951
2020/01/15
1.7K1
扎心了!中国尚未掌控的核心技术清单
前段时间美国全面制裁封杀中兴一事闹得沸沸扬扬,因为,一旦制裁实施,中兴将会陷入无零件可买、也无技术可支援的绝境之中,在这样的情况下中兴能够撑多久?这绝对是一个非常大的问题。这一重大事件,不得不让我们重新思考思考再思考“核心技术”到底是什么?我们到底在什么位置?我们到底有多少真正可以引以为傲的资本,又有多少傲慢是毫无底气的!
钱塘数据
2018/07/30
9840
扎心了!中国尚未掌控的核心技术清单
中国亟待攻克的“卡脖子”技术清单
“不锈钢能不能不生锈?”这个有点黑色幽默的问题,几乎让中国航天科技集团六院发动机专家、长征五号运载火箭副总设计师陈建华落下心病。
钱塘数据
2018/07/30
7.9K0
中国亟待攻克的“卡脖子”技术清单
2021年钢铁行业发展研究报告
钢铁行业是生产销售钢铁产品的行业。钢铁是铁与C(碳)、Si(硅)、Mn(锰)、P(磷)、S(硫)以及少量的其他元素所组成的合金。其中除Fe(铁)外,C的含量对钢铁的机械性能起着主要作用,故统称为铁碳合金。它是工程技术中最重要,也是用量最大的金属材料。
资产信息网
2022/04/18
7490
2021年钢铁行业发展研究报告
机器人相关学术速递[7.8]
【1】 RRL: Resnet as representation for Reinforcement Learning 标题:RRL:RESNET作为强化学习的表示
公众号-arXiv每日学术速递
2021/07/27
3620
重温计算机简史:从石头计数到计算机
计算机始祖 谁都知道,电脑的学名叫做电子计算机。以人类发明这种机器的初衷,它的始祖应该是计算工具。英语里“Calculus”(计算)一词来源于拉丁语,既有“算法”的含义,也有肾脏或胆囊里的“结石”的意思。远古的人们用石头来计算捕获的猎物,石头就是他们的计算工具。著名科普作家阿西莫夫说,人类最早的计算工具是手指,英语单词“Dight”既表示“手指”又表示“整数数字”;而中国古人常用“结绳”来帮助记事,“结绳”当然也可以充当计算工具。石头、手指、绳子……,这些都是古人用过的“计算机”。 不知何时,许多国家的人
大数据文摘
2018/05/24
1.4K0
现代汉语常用3500字=常见字2500字+次常见字1000字
使用requests库爬取https://www.zdic.net/zd/zb/cc1/
菲宇
2019/09/06
3.4K0
日文字符集
特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!
收心
2022/03/01
1.8K0
德勤2020科技、传媒和电信行业预测
想象一下这种现实:边缘人工智能芯片、私有5G网络以及机器人均实现互联,而 广告支持的视频和有线电视同时受彼此及低轨道卫星的影响。
用户6026865
2020/03/04
1K0
数据中心机房建设方案
数据中心机房总面积大约178平方米,使用面积约为123平方米,分为三个功能区域,分别为主设备机房、动力机房、操作间、钢瓶间。各间需要单独隔开。隔开后主设备机房用于放置配线柜、机柜、服务器、小型机、网络设备、通讯设备等重要设备;动力机房放置UPS、电池、配电柜等。
全栈程序员站长
2022/08/22
2.7K0
数据中心机房建设方案
SQL简体繁体转换函数代码
在SQL查询窗口中直接创建表和函数 --生成码表 if exists (select * from dbo.sysobjects where id = object_id(N'[codetable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [codetable] GO declare @j varchar(8000),@f varchar(8000) select @j=' 啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎
用户1149182
2020/06/19
3.8K0
2021年材料员-岗位技能(材料员)新版试题及材料员-岗位技能(材料员)考试试卷
安全生产模拟考试一点通:硝化工艺考试内容是安全生产模拟考试一点通生成的,硝化工艺证模拟考试题库是根据硝化工艺最新版教材汇编出硝化工艺仿真模拟考试。2021年硝化工艺考试内容及硝化工艺考试报名
全栈程序员站长
2022/09/02
8520
30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】
Mesh Filter 组件包含对网格的引用。该组件与同一个游戏对象上的 Mesh Renderer 组件配合使用;Mesh Renderer 组件渲染 Mesh Filter 组件引用的网格。
呆呆敲代码的小Y
2023/07/05
3.2K0
30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】
推荐阅读
相关推荐
20191124_射雕侠侣和天龙八部小说分类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档