哈希表(也叫关联数组)一种通用的数据结构,哈希表是一种通过关键码去寻找值得数据映射结构

例:新华字典。如果我想知道“按”的详细信息,根据拼音去查找拼音索引,首先查找"an"在字典中的位置,如图所示,就会找到“安”,这个过程就是键码映射,通过key去查找f(key)。其中,安就是关键字(key),f()就是字典索引,也就是哈希函数,查到的页码4就是哈希值。

通过例子可以知道:哈希表是一种通过哈希函数将特定的键映射到特定值的一种数据结构,它维护着键和值之间的一一对应关系。

键(key):又称为关键字。唯一标识要存储的数据,可以是数据本身或者数据的一部分。

槽(slot/bucket):哈希表中用于保存数据的一个单元,也就是数据真正存放的容器。

哈希函数(hash function):将键映射到数据应该存放的槽所在位置的函数。

哈希冲突(hash collision):哈希函数将两个不同的key映射到同一个索引。

列举一个哈希函数:

int h(int x){return (x%5);
}

哈希表是一个时间和空间做权衡的数据结构。如果没有内存限制,那么可以直接将键作为数组的索引,此时所有查找的时间复杂度是O(1);如果没有时间限制,将键无序存放,查找是顺序查找,时间复杂度是O(n)。而哈希表是在少量空间上实现约为O(1)时间复杂度的查找。

如何构造哈希函数呢?
哈希函数的构造要能够让数据均匀地哈希到槽内,尽量少的减少哈希冲突,哈希函数的构造显得尤为重要:

1、直接寻址法

取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)

在使用时,为了使哈希地址与存储空间吻合,可以调整a和b…

特点是:哈希函数简单,并且对于不同的关键字不会产生冲突,但是实际问题中,由于关键字集中的元素很少且是连续的,会造成空间的大量浪费,也挺少用的。

2、 数字分析法

假设有一组关键字,每个关键字由几位数字组成,如K1 K2 K3…Kn。是从中提取数字分布比较均匀的若干位作为哈希地址。

例如:对于关键字k1到k8的序列{100011211
100011322 100011413 100011556 100011613 100011756 100011822 100011911} ,可以取第6和第7位作为哈希地址, H(K1)=12
H(K2)=13 H(K3)=14 H(K4)=15 H(K5)=16 H(K6)=17 H(K7)=18 H(K8)=19 。

3、 平方取中法

是取关键字平方的中间几位作为散列地址的方法,具体取多少位看情况,即:H(Ki)=“Ki的平方的中间几位“这也是常用的较好的设计哈希函数的方法。关键字平方后使得它的中间几位和组成关键字的多位值均有关,从而使哈希地址的分布更为均匀,减少冲突的可能性。

4、 折叠法

是首先把关键字分割成位数相同的几段(最后一段位数可少些),段的位数取决于哈希地址的位数,由实际情况而定,然后将他们叠加和(舍去最高进位)作为哈希地址的方法。与平方取中法类似,折叠法也使得关键字的各位值都对哈希地址产生影响。

5、 除留余数法

取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。

例如上面的示图,5换成2呢,冲突更严重,所以p的选取很重要。

对不同的关键字可能得到同一散列地址,即k1!=k2,而f(k1)=f(k2),这种现象称为碰撞(英语:Collision),也叫哈希冲突。

解决方法:

1、链地址法:
当出现哈希冲突时,在冲突的地方通过链表来解决

这个图中h(x) = x mod 10 ;是一个哈希函数,可见代入x=91和x=1的时候都会到映射到键值为1的slot,那么这样就会引发冲突,在链地址法中,用链表延展去存储同键值的数据。

优点:

  • 处理冲突简单,无堆积现象,非同义词不会产生冲突,平均查找时间短
  • 在用链地址构造的散列表中,删除结点的操作易于实现

缺点:
哈希冲突比较大的时候(卡槽大小为10,存放10000数据,每个卡槽均1000数据。 极端情况下所有数据在一个卡槽…退化成链表)

2、线性探测法
通过散列函数hash(key),找到关键字key在线性序列中的位置,如果当前位置已经有了一个关键字,就产生了哈希冲突,就往后探测i个位置(i小于线性序列的大小),直到当前位置没有关键字存在。

添加89 ,18,49,58,9
给定哈希函数f(x)=x mod 10
添加89:f(89)=89 mod 10 ==9,当前89存储在9号卡槽位置

添加18:f(18)=18 mod 10 ==8,当前18存储在8号卡槽位置

添加49:f(49)=49 mod 10 ==9,产生了冲突,往后找到第一个空闲位置插入:将49就插入到0号位置

添加58:f(58)=58 mod 10 ==8,产生了冲突,经过多轮探测找到1号位置

Probing探测
p(k,i)探测函数。其值为第i次探测时相对h(k)的偏移

线性探测

p(i) = i ;

探测值也可以改变

p(i) = i * c ;

Random Probing 随机探测

p(k,i) = random();

但是并不存在真随机,如果存在真随机,会出现slot无法被哈希函数搜索到

哈希表及哈希冲突的解决相关推荐

  1. 高级数据结构与算法 | 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶

    文章目录 哈希 哈希函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列的解决方法 开散列的解决方法 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) 插入 查找 删除 完整 ...

  2. 哈希表及哈希冲突解决办法

    哈希表及哈希冲突解决办法 目录 什么是哈希表? 哈希表的数据结构 哈希冲突 哈希冲突解决办法 1. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直 ...

  3. 哈希表构造与处理冲突方法

    我们知道:哈希表是一个固定大小的数组,数组的每个元素是一个链表(单向或双向)的头指针.如果Key一样,则在一起,如果Key不一样,则不在一起.哈希表的查询是飞快的.因为它不需要从头搜索,它利用Key的 ...

  4. 哈希表(哈希函数和处理哈希冲突)_20230528

    哈希表(哈希函数和处理哈希冲突) 前言 关于哈希表的主题的小记原计划5月23日完成,由于本人新冠阳性,身体发烧乏力,周末感觉身体状况稍加恢复,赶紧打开电脑把本文完成,特别秉承"写是为了更好地 ...

  5. 三问了解哈希表和哈希冲突

    什么是哈希表? 哈希表也叫散列表,它是基于数组的.这间接带来了一个优点:查找的时间复杂度为 O(1).当然,它的插入时间复杂度也是 O(1).还有一个缺点:数组创建后扩容成本较高. 哈希表中有一个&q ...

  6. 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶

    文章目录 哈希 哈希(散列)函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列(开放地址法) 开散列(链地址法/拉链法) 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) ...

  7. python 哈希表_哈希表哪家强?编程语言找你来帮忙!

    点击关注上方"五分钟学算法", 设为"置顶或星标",第一时间送达干货. 转自编程技术宇宙 哈希表华山论剑 比特宇宙编程语言联合委员会准备举办一次大会,主题为哈希 ...

  8. PAT甲级1145 Hashing - Average Search Time:[C++题解]哈希表、哈希表开放寻址法、二次探测法、求平均查找次数

    文章目录 题目分析 题目链接 题目分析 来源:acwing 本题的分析见另一道PAT的题目:PAT甲级1078 Hashing:[C++题解]哈希表.哈希表开放寻址法.二次探测法链接的题目就是让建立h ...

  9. 除留余数法构造哈希表_哈希表算法原理

    基本概念 哈希表(Hash Table)是一种根据关键字直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数. 哈 ...

  10. 哈希表及哈希表查找相关概念(转)

    1. 哈希表的概念 对于动态查找表而言,1) 表长不确定:2)在设计查找表时,只知道关键字所属范围,而不知道确切的关键字.因此,一般情况需建立一个函数关系,以f(key)作为关键字为key的录在表中的 ...

最新文章

  1. 定义一个Address 类(java)
  2. Nature封面:人类还在看提词器,AI的辩论能力却出现了重大进展
  3. pyinstaller安装以及生成exe文件
  4. 15-07-05 语句-跳转语句异常语句
  5. go使用PostgreSQL数据库
  6. ubuntu sever 命令行 使用 u盘
  7. 【DP】【高精】幸运票 (jzoj 2122)
  8. JPA / Hibernate:基于版本的乐观并发控制
  9. Samba简单应用案例
  10. 【Oracle】DBMS_STATS.GATHER_TABLE_STATS
  11. R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(一,基本原理)
  12. 快排算法的非递归实现
  13. word论文排版插件_Word自动排版软件
  14. 在HTML中禁止IE缓存
  15. 真正的爱情是日久生情
  16. 【进阶数据挖掘技术】进阶数据挖掘技术介绍
  17. 程序员最爱说的十句口头禅。。 | 今日最佳
  18. css文字超过两行溢出隐藏
  19. Apache Spark在海致大数据平台中的优化实践
  20. 宜信技术研发中心暑假实习总结

热门文章

  1. 天津工业大学计算机考研资料汇总
  2. 电脑连续复制粘贴,随意复制,随意粘贴,需要打开剪贴板功能。
  3. 医院网络管理员职责_系统管理员职责:9个关键任务
  4. 2008--09--01望月
  5. 从苏宁电器到卡巴斯基(后传)第01篇:讲讲我写完那36篇故事之后的一些事
  6. 51 nod 1069 Nim游戏
  7. ktv无线服务器,KTV,酒店无线wifi上网无线AP服务器
  8. win7 odbc access 2003 win7下ODBC数据源ACCESS2003的链接
  9. 手机wem文件转换软件_wem文件如何播放和转换成Ogg或MP3格式?
  10. jython mysql_Jython中链接Oracle数据库