哈希表详解---构建、hash冲突、查找

一、基本概念:
根据设定的哈希函数以及处理冲突的方法将查找表中各数据元素存储在一段有限的连续空间中,即得哈希表,也称散列表。
二、构造哈希函数的基本方法
1) 直接定址法
取关键字或关键字的某个线性函数值为散列地址。
即 f(key) = key 或 f(key) = a*key + b,其中a和b为常数。
eg:以人口统计表中的年龄直接作为存储地址
在这里插入图片描述
2) 除留余数法
取关键字被某个不大于散列表长度 m 的数 p 求余,得到的作为散列地址。
即 f(key) = key % p, p < m。这是最为常见的一种哈希算法。
eg:
一组关键字:19,14,23,01,68,20,84,27,55,11,10,79
p=13 即 f(key) = key % 13,
可得 地址:6,1,10,1…
对P加以限制?
p为质数,若p中含有质因子3(eg:9),则所有含质因子3的关键字均映射到“3的倍数”的地址上,从而增加了“冲突"的可能。
3) 数字分析法
若关键字是r进制数,且预知全部可能出现的关键字值,则可取关键字中若干位构成哈希地址 尽可能取分布均匀的,不发生冲突的位置
eg:
关键字集合:
在这里插入图片描述
则可以取4567中任意两位作为哈希地址,假设取45两位
4) 平方取中法
先计算出关键字值的平方,然后取平方值中间几位作为散列地址。
随机分布的关键字,得到的散列地址也是随机分布的。
5)折叠法
将关键字值分割成位数相同的几个部分,然后取这几个部分商务叠加和(舍去进位)座位哈希地址
eg1: 直接叠加:
图书编号:0-442-20586-4 每四位一折,可得三段,再将各部分按最低位对齐后相加并舍去进位,即得对应的哈希地址,5864+4220+04=10088,舍去进位1,则书放在0088(88)的地址上
eg2:间接叠加:
同上,各段沿分割届来回折迭后对齐相加,舍去进位即得对应的哈希地址 :5864+0224+04=6092,则书放在6092的地址上
三、处理冲突的基本方法
处理冲突指对于一个待插入哈希表的数据元素,若按给定的哈希函数求得的哈希地址已被占用,则按规则求下一个哈希地址,如此重复,直至找到一个可用的地址以保存该元素。
常见的哈希冲突解决办法有两种,开放地址法和链地址法。
1、开放地址法
开发地址法的做法是,当冲突发生时,使用某种探测算法在散列表中寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到。按照探测序列的方法,一般将开放地址法区分为线性探查法、二次探查法、双重散列法等。
方法
令fi=(f(key)+di) % m ,i=1,2,…m-1,其中f(key)为哈希函数,m为哈希表长,di为增量系列
若取di=1,2,3,…,m-1,则称线性探测再散列;
若取di=12,-12,22,-22,…,±k^2,则称二次探测再散列;
若取di=伪随机数系列,则称伪随机探测再散列;
eg1: 设有一组关键字:67,84,18,26,34,28,哈希函数为f(key)=key%7,则哈希函数的存储如下:
有冲突时:fi=(f(key)+di)%7;
在这里插入图片描述
eg2: 关键字集合:19,01,23,14,55,68,11,82,36,
哈希函数:f(key)=key%11
有冲突时:fi=(f(key)+di)%7;
若采用线性探测再散列处理冲突 di=1,2,3,…,m-1
在这里插入图片描述
若采用二次线性探测再散列处理冲突 di=12,-12,22,-22,…,±k^2
在这里插入图片描述
2、链地址法
将所有按给定的哈希函数求得的哈希地址相同的关键字存储在同一线性表中,且使链表按关键字有序
eg:关键字集合:67,84,18,26,34,28
哈希函数:f(key)=key%7
有冲突时:在对应链表中插入新结点
在这里插入图片描述
3.公共溢出区
若关键字所对应的哈希地址已被占用,则保存到公共溢出区中
eg:关键字集合:67,84,18,26,34,28
哈希函数:f(key)=key%7
有冲突时:保存到公共溢出区
在这里插入图片描述
四、在哈希表中查找元素
方法:
在哈希表中查找数据元素的过程与数据元素插入哈希表的过程基本一致,即:
1.根据待查关键字,按给定的哈希函数,求哈希地址;
2.若该地址上五数据元素,则查找失败;
3.若该地址上有数据元素,则进行关键字值间的比较;
若相等,则查找成功;
若不相等,则按冲突处理方法求下一可能的存储位置。
eg:哈希函数
哈希函数:f(key)=key%7
有冲突时:fi=(f(key)+di)%7; 其中di=1,2,3,4,5,6
在这里插入图片描述
虽然哈希表在关键之和存储位置之间建立了映像,但由于冲突的存在,查找时仍需进行关键字之间的比较,因此仍以查找成功时的平均查找长度和查找不成功时的比较次数作为衡量查找效率的依据。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值