哈希和哈希表

哈希和哈希表

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表

名称:Hash表、散列表

实现:Hash函数、链表结构

思想:离散化、映射

方法:用Hash函数把复杂的信息(例如字符串、大整数等)映射到一个容易维护的值域内。

注意:因值域变简单、范围变小,有可能造成两个不同的原始数据被Hash函数映射为相同的值,特殊处理(链表处理、优化hash函数)。

用处:通过Hash函数转化得到的数值成为哈希值

img

一、Hash表

1.基本操作

(1)计算当前数据的Hash值(通过Hash函数)

(2)定位到对应链表中依次遍历、比较

2.整数的Hash函数构造方法

(1)直接取余法(常用)

关键字k除以m,取余数作为在Hash表中的位置。函数表达式可以写成:
      h(k)=k mod m

int h(int key)
{
	return key%m;//m为大质数 
} 

(2)乘积取整法
  关键字k乘以一个在(0,1)中的实数(最好是无理数),得到一个(0,1)之间的实数;取出其小数部分,乘以m,再取整数部分,即得K在Hash表中的位置

img

(3)基数转换法

(4)太多方法 自创也可以

3.字符串hash函数构造方法

问题需求:查询子串在母串中出现的次数

问题解决:把任意长度的字符串映射成一个非负的整数,并保准冲突概率几乎为0.

具体方法:

取一固定值base,把字符串看作base进制数,并分配一个大于0的数值,代表每种字符。一般来说,对每种字符的分配值都小于base(可以直接使用字符的Ascall值)。但是,字符串用base进制数表示后一般会很大,通常取一固定值M,作为模数对每个字符串所对应的base进制数取模。
一般我们取base=131 或 base=13331。取M=2^64,即直接unsigned long long 类型存储字符串的Hash值(ull 的自然溢出相当于对2^64取模,且能够避免低效的取模(mod)运算)。此时Hash值产生冲突的概率极低,如果两个字符串Hash值相同,就可以认定这两个字符串相等。

​ 1.处理前缀
如果一个字符串S的Hash值为H(S),那么再S后加上一个字符c构成的新字符串S+c的Hash值就是

H(S+c)=(H(S)×base+val[c])%M。val[c]是c的对应值。
如果一个字符串S的Hash值为H(S),那么再S后加上一个字符串T构成的新字符串S+T的Hash值就是

H(S+T)=(H(S)×base^lenth(T)+H(T))%M。

相当于base进制下把S后边补上T个0再加上T的值。

​ 2.查询
如果我们要查询字符串S的S[L~R]的字符串的Hash值,我们利用前缀O(1)的求出来。
即H(L~R)=H( R )-( H( L-1 )* base^( R - L + 1 ) )。

这也是采取了补0的方式进行的计算。

4.冲突解决

不同数据的关键字通过哈希函数得到一个相同的地址,这时就发生冲突,这种冲突一般叫做哈希冲突。

我们希望冲突出现的越少越好,解决办法常见的:开放地址法链地址法等。

  • 开放地址法:一旦发生冲突,就寻找下一个空的哈希地址,只要哈希表足够大,总能找到地址存放。

  • 再哈希法:遇到哈希冲突时,换一个哈希函数计算,一般双hash就可以。

  • 链地址法:

将同义词存储在一个单链表中,我们称这种单链表为同义词子表,哈希表中存储同义词子表的头指针。下图中的哈希函数为
H(key) = key mod 13。可以看出1、14、27、79取余结果都是1,哈希表中的地址1保存了1、14、27、79这个链表的头指针。

在这里插入图片描述

4.哈希表的优缺点

优点:不论哈希表中有多少数据,插入和删除很快,时间复杂度O(1);查询速度比树快,树的时间复杂度为O(n),因而若不需要有序遍历且数据量大小可预判,哈希表查询很快。
缺点:基于数组的数据结构,难于扩展。因而需要对表中数据量有清楚的认识。

总结

  1. hash的定义:Hash一般翻译为散列,哈希是指一个过程,这个过程就是把任意长度的输入,通过哈希算法,变换成固定长度的输出,所输出的称为哈希值。这种变换是一种压缩映射,也即哈希值所占的空间一般来说远小于输入值的空间,不同的输入可能会哈希出相同的输出(概率很小)。
  2. hash值的作用:数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法
  3. 哈希的特点:
  • 如果两个哈希值是不相同的(根据同一函数),那么这两个散列值的原始输入一定是不相同的。
  • 如果两个哈希值相同,两个输入值很可能(极大概率)是相同的,但也可能不同,这种情况称为“哈希碰撞”
  • 抗篡改能力:对于一个数据块,哪怕只改动其一个比特位,其hash值的改动也会非常大。
  • 它是一种单向函数是“非对称”的,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。
  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值