二十、哈希表的基础知识

哈希表是什么?

  • 定义:根据设定的哈希函数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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__泡泡茶壶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值