数据结构探究:哈希表(Hash)相关知识点

哈希表(Hash)相关知识点

  • 哈希表:又称为散列表,是根据关键字(Key)而直接进行访问的数据结构。即:它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

  • 哈希函数:哈希表的存储位置和关键字之间的对应关系(即:哈希函数是一个映像)。

    综合以上概念,我们用公式来表示通过哈希法求存储地址:P=f(Key)。

  • 需要注意的是,不同的关键字可能得到同一个哈希地址,该现象就是冲突,下面我们会介绍处理冲突(为产生的地址的寻求下一个哈希地址)的几种方法。

哈希函数的构造方法

1、直接定址法

概念:取关键字的某个线型函数值为哈希地址。即:H(key) = a*key+b,其中a,b为常数。
举个例子:假设,学校在做年龄统计,现在需要查询学龄在3岁的人数,则只需要查询表的第三项就可以了。

地址 01 02 03 04
学龄 1 2 3 4
人数 234 240 243 257

2、数字分析法

概念:假设关键字是R进制的数,并且哈希表中可能出现的关键字都已知,则可以取关键字的若干位组成哈希地址。

3、平方取中法

概念:取关键字平放后的中间几位为哈希地址。通常来说一个数平方后中间的几位和数的每一位都有关系。
举个例子:关键字为234,则平方后54756,则取475位哈希地址

4、折叠法

概念:将关键字划分为位数相同的几部分(注意:最后一部分的位数可以不同),然后取这部分的叠加和作为哈希地址(注意:叠加和时不需要考虑进位问题)。
一般来说叠加分为移位叠(每一部分的最低位对齐,然后按位相加)加和间界叠加(从一端向另一端沿着分界线来回折叠)两种。

5、除留余数法(最常用的方法)

概念:取关键字被某个不大于哈希表长度(len)的数(p)除后所得余数为哈希地址。即:H(key) = key MOD p,p是小于等于len的最大素数(MOD为取模运算)。
举个例子:
表长len为10,p为7:

key 12 39 15 24 33 21
k%7 5 4 1 3 5 0

随机数法

概念:选择一个随机函数,取关键字的随机函数值为它的哈希地址。即:H(key)=random(key)。

注意: 实际上,我们需要按照下列要求来选择哈希函数建立哈希表:
(1)哈希函数执行的时间;
(2)关键字的长度;
(3)哈希表的长度;
(4)关键字的分布情况;
(5)记录的查找频率。

处理冲突的方法

1、开放定址法

基本思想:当利用哈希函数产生的地址发生冲突时,以原来的哈希地址P为基础,产生另一个哈希地址P1,如果P1仍然冲突,再以p为基础,产生另一个哈希地址P2,直到找出可用的哈希地址Pi ,再将相应元素存入其中。
这里有个通用的公式:
H0,H1,H2……Hs (1<=s<=len)
其中:
H0=H(key)
H1=(H(key)+di) MOD len (i=1,2……s)

具体的方法有以下几个:

1)线性探测再散列

di=c*i (最简单的一种情况是c=1)
特点:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
举例:关键字集合{19,01,23,14,55,68,11,82,36},设定哈希函数为:H(key)=key MOD 11(表长len为11)。
解:(取c=1)
数据结构探究:哈希表(Hash)相关知识点_第1张图片

2)二次探测再散列

di=n^2 (n=0,1,2……)
特点:冲突发生时,在表的左右进行跳跃式探测,比较灵活。
举个例子:关键字集合{19,01,23,14,55,68,11,82,36},设定哈希函数为:H(key)=key MOD 11(表长len为11)。(还是上面的题)
解:(由于上面的题解比较详细,所以在这里给出答案就好了)

地址 0 1 2 3 4 5 6 7 8 9 10
学龄 55 01 23 14 36 82 68 19 11

3)伪随机探测再散列

di=伪随机数序列。
特点:具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),并给定一个随机数做起点。
如果是伪随机探测再散列会更简单,只要知道随机序列就好了。具体的解答可以自己尝试一下。

2、再哈希法

Hi=RHi(key), i=1,2,…,k RHi均是不同的散列函数(见上面所述),在同义词产生地址冲突时就换用另一个散列函数计算散列地址,直到不再发生冲突。虽然,这种方式可以处理冲突,但是,很明显,增加了计算的复杂程度。

3、链地址法

基本思想: 将所有哈希地址为i的元素构成一个称为同义词链的单链表,在散列表中只存储所有同义词子表的头指针。
举个例子:关键字集合{19,01,23,14,55,68,11,82,36},设定哈希函数为:H(key)=key MOD 11(表长len为11)。(还是之前的例子)
解:数据结构探究:哈希表(Hash)相关知识点_第2张图片

4、建立公共溢出区:

基本思想:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。在查找时,对给定关键字通过散列函数计算出散列地址后,先与基本表的相应位置进行比对,如果相等,则查找成功;否则,在溢出表进行顺序查找。

你可能感兴趣的:(数据结构)