HashTable学习

HashTable是什么?

引用百度百科的解释, 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
我理解的HashTable,一般来说,数组的查找速度相对链表快,而插入删除慢,链表插入删除操作快,但查找速度慢,将其有机的结合在一起就产生了HashTable.(类似JOJOLION中吉良吉影与空条仗世文结合成为东方定助)
通过结合数组和链表,得到了又能快速查找也能快速插入或删除的HashTable.

HashTable是怎么查找的?

使用哈希函数将被查找的键转化为数组的索引. HashTable是一个空间与时间平衡的例子,没有时间限制,我们可以直接用键来作为数组的索引,这样可以将查找时间做到最快(O(1)).如果没有时间的限制,我们可以使用无序链表进行顺序查找,这样只需要很少的内存.

哈希冲突

在理想的状态下,不同的键会被转化成不同的索引值,但在实际情况中我们会遇到哈希函数算出来的地址被别的元素占用,也就是,这个位置有人了.好的哈希函数会尽量避免哈希冲突,但发生冲突是怎么办.大致有四种方法.

1 开放定址法:就是当关键字key的哈希地址p=H(key)出现冲突时,以p为基础再产生一个
p1,若p1仍冲突,就以p为基础再产生一个p2,这种方法有一个通用的再散列函数形式:
Hi=(H(key)+di)%m i=1,2,…,n.

2 再哈希法,构造多个哈希函数,当用第一个函数计算出的哈希地址冲突时,就用第二个,以此类推.

3链地址法,这种方法的是将所有哈希地址相同的元素i构成一个单链表,将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在单链表中进行.适用于需要进行大量插入,删除操作的情况.

4建立公共溢出区,建立哈希表时,将表分为基本表和溢出表,和基本表发生冲突的元素存入溢出表中.

<1> 拉链法
将大小为M的数组的每一个元素指向一个链表,链表中的每一个节点都存储散列值为该索引的键值对,这个就是拉链法

在这里插入图片描述
Hermit Purple和CreazyDiamond都指向005这个索引,而索引又指向一个链表,在链表中依次存储了这两个字符串
<2> 线性探索法
线性探测法是开放寻址法解决哈希冲突的一种方法,基本原理为,使用大小为M的数组来保存N个键值对,其中M>N,我们需要使用数组中的空位来解决碰撞冲突.
在这里插入图片描述
当CreazyDiamond指向005时,005已经被Hermit Purple占了,于是向后找,006没有被占,所以放在006,同理当Gold Experience指向006时,被Hermit Purple占,于是向后找,放在007.

哈希函数

哈希的过程中需要使用哈希函数进行计算。

哈希函数是一种映射关系,根据数据的关键词 key ,通过一定的函数关系,计算出该元素存储位置的函数.
表示为:
address = H [key]
主要应用在以下这几个方面:文件校验、数字签名、鉴权协议。常用的哈希算法有以下这些。

<1>MD5:MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.MD5是输入不定长度信息,输出固定长度128bits的算法.
<2>SHA-1:常用于HTTPS传输和软件签名.
<3>SHA-2:SHA-224/SHA-256/SHA-384/SHA-512并成为SHA-2.
<4>SHA-3:之前名为Keccak算法,是一个加密杂凑算法.

参考:
https://blog.csdn.net/qq_43761480/article/details/99124618
https://blog.csdn.net/iva_brother/article/details/82253989
https://blog.csdn.net/u012835097/article/details/79407591

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值