哈希表是什么?
- 定义:根据设定的哈希函数H(key)和处理冲突的方法,将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表称为哈希表,也叫作散列表,这一映射过程称为哈希造表或散列,所得的存储位置称为哈希地址或散列地址。
- 构造哈希表:以记录的关键字为自变量计算一个函数( 称为哈希函数)来得到该记录的存储地址并存入元素,因此在哈希表中进行查找操作时,必须计算同一个哈希函数,首先得到待查记录的存储地址,然后到相应的存储单元去获得有关信息再判定查找是否成功。
- 对于某个哈希函数H和两个关键字K1和K2,如果K1≠K2,而H(K1)=H(K2),则称为冲突。具有相同哈希函数值的关键字对该哈希函数来说称为同义词。
处理构造哈希表出现的冲突
开放定址法
- Hi=(Hash(key)+di) %m i=1, 2,…,k (k≤m-1),其中,Hash(key)为哈希函数; m为哈希表的表长; di为增量序列。
- 常见的增量序列有如下三种。
1、 di =1, 2, 3,…,m-1,称为线性探测再散列。
2、 di =12, -12, 22,-22,32,…,士k2 (k≤m/2),称为二次(平方)探测再散列。
3、 di =伪随机序列,称为随机探测再散列。 - 最简单的产生探测序列的方法是进行线性探测。也就是发生冲突时,顺序地到存储区的下一个单元进行探测。例如,某记录的关键字为key,哈希函数值H(key)=j。若在哈希地址j发生了冲突(即此位置已存放了其他元素),则对哈希地址j+1进行探测,若仍然有冲突,再对地址j+2进行探测,依此类推,直到将元素存入哈希表。
开放定址法例题
- 设关键码序列为 47,34,13, 12,52,38,33,27,3,哈希表表长为11, 哈希函数为Hash(key)=key mod 11,则:
Hash(47)= 47 MOD 11= 3,Hash(34)= 34 MOD 11= 1,Hash(13)= 13 MOD 11 =2,
Hash(12)= 12 MOD 11= 1,Hash(52)= 52 MOD 11= 8,Hash(38)= 38 MOD 11 =5,
Hash(33)= 33 MOD 11 =0,Hash(27)= 27 MOD 11 =5,Hash(3)= 3 MOD 11 = 3 - 使用线性探测法解决冲突构造的哈希表如下:
链地址法(拉链法)
- 概述:链地址法是一种经常使用且很有效的方法,又叫做拉链法。它将具有相同哈希函数值的记录组织成一个链表,当链域的值为NULL时,表示已没有后继记录。
- 例如,哈希表表长为11、哈希函数为Hash(key)=key mod11,对于关键码序列47, 34, 13,12,52,38,33,27,3,使用链地址法构造的哈希表如下图所示:
哈希查找
- 概述:在哈希表中进行查找操作时,用与存入元素时相同的哈希函数和冲突处理方法计算得
到待查记录的存储地址,然后到相应的存储单元获得有关信息再判定查找是否成功。 - 在线性探测法解决冲突的方式下,进行哈希查找有3种可能:
1、第一种情况是在某一位置上查到了关键字等于key的记录,查找成功;
2、第二种情况是按探测序列查不到关键字为key的记录而又遇到了空单元,这时表明元素不在表中,表示查找失败。
3、第三种情况是查遍全表,未查到指定关键字且符号表存储区已满,需进行溢出处理。 - 在用链地址法解决冲突构造的哈希表中查找元素,就是根据哈希函数得到元素所在链表的头指针,然后在链表中进行顺序查找的过程。
例题
- 对于关键字序列(10,34,37,51,14,25,56,22,3), 用线性探查法解决冲突构造哈希表,哈希函数为H(key)=key%11,关键字25存入的哈希地址编号为( )。
A、2 B、 3 C、 5 D、6
- 解析:本题考查哈希表的基础知识。
用线性探查法解决冲突构造哈希表的步骤如下:
1)、序列的长度为11,标号0到10;
2)、依次将数带入哈希函数求哈希值,哈希值对应步骤1中标号;
3)、如果步骤2)的哈希值对应的标号已经被占用,则往后一位,直到未占用的位置存放;
关键字序列(10,34,37,51,14,25,56,22,3)通过key%11计算得到对应的序列(10,1,4,7,3,3,1, 0,3)。需要注意的是,我们的序列是按照顺序依次进行存放的,本题25代入哈希值为3,其中3已被14所占,后退一位4号被37占用,其中5号为空,所以25应该存入标号为5的位置。 - 故本题的正确答案为C