Hash 哈希表

哈希表是一种数据结构,通过散列函数将关键值映射到数组位置以快速访问数据。常见的哈希函数如除留余数法,遇到哈希冲突时,可以采用链地址法或开放定址法解决。此外,文章还介绍了布隆过滤器,一种用于高效插入和查询,但可能产生误判的概率型数据结构。
摘要由CSDN通过智能技术生成

一 <<什么是哈希表>>

我们学习了数据结构,其实都在做一件事情那就是   数据的结构    无论是学了啥?目的都是为了 存储数据  数据排序  查找数据

  • 线性结构有 顺序表 链表
  • 非线性的有  图       树       哈希

1.1 哈希表的定义

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

 remark: 通过某种映射关系  比方将你映射为 阿兰图灵  那么在这个名人散列表查找到图灵时就等于找到了你

通常无论是在  顺序表,链表,树,图,均是 迭代访问数据,即遍历(挨个挨个访问),效率通常比较慢,但是当来到了hash它就会变得非常快(一映射,根据映射的地方查找,很快就能找到)

 哈希表的几个概念

散列函数

比如说,我现在给你个电话本,上面记录的有姓名和对应的手机号,我想让你帮我找王二的手机号是多少,那么你会怎么做呢?

你可能会说,那挨个找呗。

确实可以,那么你有没有想过,如果这个王二是在最后几页,那你去岂不是前面几页都白找了,有没有更快的方式呢?

是不是可以按照人名给分个类,比如按照首字母来排序,就abcd那样的顺序,这样根据王二我就知道去找w这些,这样不久快很多了

我们可以按照人名的首字母去弄一个表格,比如像这样:
 

我们取姓名的首字母作为一个标志,就可以很快的找到以这个字母开头的人名了,那么王二也就能更快的被我们找到,我们也不用再费力气去找什么张二和李二的,因为人家的名字首字母都不是w。

这里我们用到了一种方法:那就是取姓名的首字母做一个排序,那么这是不是就是通过一些特定的方法去得到一个特定的值,比如这里取人名的首字母,那么如果是放到数学中,是不是就是类似一个函数似的,给你一个值,经过某些加工得到另外一个值,就像这里的给你个人名,经过些许加工我们拿到首字母,那么这个函数或者是这个方法在哈希表中就叫做散列函数

这种映射关系我们可能称之为  做白日梦 

remark:其实 十辈子 都不会成为阿兰这种天才,我们普通人所能做的是尽量去理解天才 

关键值key

就像画的这个图,阿兰  是怎么得出来得,是不是由我映射而来,这个映射过程其实就是个散列函数,而我就是整个散列体系的关键值

哈希表

所以说:哈希表就是通过将关键值也就是key通过一个散列函数加工处理之后得到一个值,这个值就是数据存放的位置,我们就可以根据这个值快速的找到我们想要的数据

1.2 哈希表的存储方式

之前我们已经知道了哈希表的本质其实是个数组,数组有啥特点?
——下表从0开始,连续的,直接通过下标访问

  •  键值对:有一个key和一个value对应着,比如图中的101011是键值key,对应value张三,学生的学号和姓名就是一个键值对
  • Entry:在java jdk里把键值对叫做Entry,C++则为pair
  • 在散列表中存储的是键值对

1.3 哈希表如何存数据

看上面的图,我们已经知道了哈希表本质是个数组,所以这里有个数组,长度是8,现在我们要做的是把这个学生信息存放到哈希表中,也就是这个数组中去,那我们需要考虑怎么去存放呢?

这里的学号是个key,我们之前也知道了,哈希表就是根据key值来通过哈希函数计算得到一个值,这个值就是用来确定这个pair要存放在哈希表中的位置的,实际上这个值就是一个下标值,来确定放在数组的哪个位置上。

比如这里的学号是101011,那么经过哈希函数的计算之后得到了1,这个1就是告诉我们应该把这个pair放到哪个位置,这个1就是数组的确切位置的下标,也就是需要放在数组中下表为1的位置,如图中所示。

我们之前已经介绍过什么是pair了,所以这里你要知道,数组中1的位置存放的是一个pair,它不是一个简单的单个数值,而是一个键值对,也就是存放了key和value,key就是学号101011,value就是张三,我们经过哈希函数计算得出的1只是为了确定这个pair该放在哪个位置而已。

现在我们就成功把这个pair放到了哈希表中了

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值