哈希(散列)表、哈希函数基本知识

哈希表

在这里插入图片描述

这些查找方法的特点:记录在表中的位置和其关键字间不存在确定关系,查找的过程为给定值依次和各个关键字进行比较,查找的效率取决进行比较的关键字个数。它们的平均查找长度(ASL)都不为0.

若希望ASL=0
方法:预先知道所查关键字在表中的位置。
即:记录在表中位置和其关键字之间的确定关系。

在一般情况下,需在关键字和记录在表中的存储位置之间建立一个函数关系,以f(key)作为关键字为key的记录在表中的位置,通常称这个函数f(key)为哈希函数
哈希函数是一个映像,即:将关键字的集合映射到某个地址集合上。

例子:
在这里插入图片描述
对哈希表进行查找的时候,待查记录不需要和其他关键字相比较,就可以发现查找是成功的还是失败的。

如果上例要添加Zhou怎么办呢?哈希表中13的位置已经有了Zhao,Zhou只能寻找下一个能够存放的空闲区域,这种就是冲突情况

在一般情况下,容易产生“冲突”现象,key1 ≠ key2,而f(key1)= f(key2)
很难找到一个不产生冲突的哈希函数。一般情况下,只能选择恰当的哈希函数,使冲突尽可能少地产生

根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集(区间)上,并以关键字在地址集中的“象”作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表”。

哈希函数

原则

  1. 函数本身便于计算
  2. 计算出来的地址尽量分布均匀

哈希函数构造方法

不管什么方法,原则是使产生冲突的可能性尽可能小。

1、数字分析法
假设关键字集合中的每个关键字都是由s位数字组成(u1,u2,…,us,),分析关键字集中的全体,并从中提取分布均匀的若干位或它们的组合作为地址。

2、平方取中法
以关键字的平方值的中间几位作为存储地址。

如下图中,几个关键字的内部代码非常接近,但是平方之后就有了明显的差别,可以取平方值其中几位作为哈希地址。这样和原来的关键字也有了一定的联系。不同关键字会以较高的概率产生不同的哈希地址。
在这里插入图片描述
3、折叠法
将关键字分割成若干部分,然后取它们的叠加和为哈希地址。

例:当图书馆馆藏不到1000时,有图书编号为12360324711202065,那它对应的哈希地址应该为多少?
图书馆馆藏不到1000,可以将图书编号3位一对折。

折叠叠加是将奇数段正序取,偶数段逆序取,进行叠加后取得的数值作为哈希地址值。即第1段正序,第2段逆序,第3段正序,第4段逆序……这样的顺序进行叠加,得到的结果作为哈希地址值。

移位叠加直接将每3位的数叠加起来,结果取新值的后3位。
在这里插入图片描述
4、除留余数法
H(key) = Key mod p
表长是m,p是<= m的最大素数
在这里插入图片描述
可以看到,如果p中含质因子3,所有有质因子3的关键字的哈希地址都映射到了3的倍数地址上。

哈希处理冲突

在哈希表中,尽管构造性能良好的哈希函数可以减少冲突,但实际上冲突是不可避免的。

处理冲突是为产生冲突的地址寻找下一个哈希地址。

开放定址法:
为产生的冲突地址H(key)求得一个地址序列:
在这里插入图片描述
如果H0不是空闲位置,那就继续加1,往下寻找,直到找到空闲位置为止。

可是如果找到了表尾,都还没找到空闲位置该怎么办呢?
如果表中存在空闲地址,就从头到尾重新试探一遍,因此计算出来的哈希地址要对表长m进行求余。这就有一个通用的再哈希的公式。值得注意的是,由于使用的是求余运算,整个表相当于一个首尾连接的循环表。
在这里插入图片描述

增量的取值方式不同,就对应不同的处理数据方法。

对增量di有三种取法:
(1)线性探测再散列:di=c*i     最简单的情况 c=1

举例说明:
在这里插入图片描述
要放入23的时候,哈希地址是1,这时发现1已经有01了,发生了冲突,于是在1的基础上加1,就是23放入2号的位置。只要冲突了,就继续加1寻找下一个空闲的位置,直到找到空位为止。
在这里插入图片描述
下图为在等概率情况下,各个关键字查找成功时的平均查找次数:
在这里插入图片描述
查找失败时,0号位置一直到9号位置为空,共比较了10次,以此类推,查找失败时的ASL如下:
在这里插入图片描述

(2)二次探测再散列:di=12,-12,22,-22,32,-32

关键字68在2号位置发生冲突,2+1=3,3号位置冲突,2-1=1,还是冲突,2+22=6,可以放入该位置。
在这里插入图片描述
在这里插入图片描述

特点:冲突发生时,在表的右左进行跳跃式探测,比较灵活。缺点是不能探测到整个散列空间。

(3)伪随机探测再散列:di=伪随机数列

猜你喜欢

转载自blog.csdn.net/ITmincherry/article/details/106799868