7-6散列查找(数据结构)

一.基础知识
1.查找——散列结构——散列表/哈希表
2.同义词:不同的关键字通过散列函数映射到同一个值,它们为“同义词”
在这里插入图片描述
3.冲突:该位置已经存放了元素,这就产生了冲突
4.解决冲突:拉链法/链地址法
将同义词存储在链表中
在这里插入图片描述
对于同义词各个关键字之间可以乱序(蓝色竖着),但如果进行排序,对链表进行顺序查找时会提高查找效率
在这里插入图片描述
二.散列查找
给出散列函数H(key)=key%13
给出关键字{19,14,23,1,68,20,84,27,55,11,10,79}
14%13=1,放在1号框,其他同理
在这里插入图片描述
(1)查找55
55%13=3,在3号框往下找,依次找到68,55,查找成功,查找长度为2
注:
查找长度:对比次数
(2)查找21
21%13=8,8号位为空,查找失败
查找长度:0
注:对比0次
(3)查找66
66%13=1,在1号框往下找,依次找到14,1,27,79,查找失败
查找长度:4
注:对比4次

三.效率分析ASL

ASL成功=(1×6+2×4+3+4)/12=1.75(横向计算)
ASL成功=[(1+2+3+4)+(1+2)+(1+2)+…]/12=1.75(竖着计算)
注:可以发现,每个框一个关键字时,效率最高
ASLmin=(1+1+1+…+1)/12=1
因此要尽可能的减少冲突
在这里插入图片描述
一个个框看查找长度(对比次数),一共13个框
ASL失败=(0+4+0+2+0+0+2+1+…)/13=0.92
可以看到,分子为蓝色框之和,分母为表长
即:ASL失败=表中记录数/散列表长度
我们称α为装填因子,α=表中记录数/散列表长度
显然:装填因子直接影响散列表的查找效率,为了提高查找效率,设计合理的散列函数就显得十分重要

四.常见的散列函数
设计目标:让不同关键字的冲突尽可能少

1.除留余数法H(key)=key%p
m:散列表表长
p:一个不大于m的最大质数(通常情况下,具体问题具体分析)
质数/素数:在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。如:2、3、5、7

举例:
表长m=13,p取13
表长m=15,p取13

2.直接定址法
H(key)=key或H(key)=a*key+b
其中a和b为常数
优势:不会产生冲突
缺点:占用空间过大
适合:关键字分布基本连续,否则会浪费空间
举例:存储一个班级同学的学生信息
每个学号和1120112176作差,得到0,1,2,3…
在这里插入图片描述
3.数字分析法
适合:分布均匀
举例:手机号
在某些位上分布均匀,某些位上分布不均匀
可以将手机号后四位作为散列地址
在这里插入图片描述
在这里插入图片描述
4.平方取中法
关键字平方,然后取中间几位
适合:关键字每位取值都不够均匀或均小于散列地址所需位数
举例:存储身份证号
身份证号平方,然后取中间5位
这样分布就比较均匀(≠不冲突)
在这里插入图片描述
在这里插入图片描述
总结
在这里插入图片描述
五.解决冲突的另一个方法:开放定址法

Hi=(H(key)+di)%m
i=0,1,2,3,…,k (k≤m-1)
m:表长
di:增量序列
i:第i次发生冲突

(一)线性探测法

1.基本概念

di=0,1,2,3,…,m-1
在这里插入图片描述
插入1,H(key)=1%13=1发生冲突
表长m=16
H0=(1+d0)%16=1依然冲突
继续计算H1=(1+d1)%16=2
成功放入
这表示空闲地址既向它的同义词开放,也向它的非同义词开放
在这里插入图片描述
继续,企图放入84
在这里插入图片描述
H(key)=84%13=6冲突
H1=(6+1)%16=7冲突
H2=(6+2)%16=8成功放入
在这里插入图片描述
放入27
在这里插入图片描述
H(key)=27%13=1冲突
H1=(1+1)%16=2冲突
H2=(1+2)%16=3冲突
H3=(1+3)%16=4成功放入
在这里插入图片描述
其他同理,如果再想放入25
在这里插入图片描述
H(key)=25%13=12冲突
H1=(12+1)%16=13成功放入
在这里插入图片描述
如果再想放入数据,最大到表长15
Hi=(H(key)+di)%16
即:冲突处理函数值域为[0,15]

对于散列函数H(key)=key%13
散列函数值域[0,12]

2.查找操作

(1)查找27
27%13=1,匹配失败
H1=2,匹配失败
H2=3,匹配失败
H3=4,匹配成功
查找长度:4
在这里插入图片描述
(2)查找11
11%13=11,匹配成功
查找长度:1
在这里插入图片描述
(3)查找21
21%13=8匹配失败
H1=9匹配失败
H2=10匹配失败
H3=11匹配失败
H4=12匹配失败
H5=13匹配失败
与拉链法的空指针不同,这里空白处也记一个元素,与空位置相比也算一次比较
查找长度:6
在这里插入图片描述
(4)查找21
21%13=8匹配失败
H1=9匹配失败
H2=10匹配失败
对比完空位置,查找结束
查找长度:3
在这里插入图片描述
3.删除操作

删除1,1空出,想要查找27时
27%13=1匹配失败
H1=2匹配是吧,遇到空白结束
未成功找到4号位的27
在这里插入图片描述
在这里插入图片描述
因此在删除1后需要告诉计算机1位置有东西(做一个删除标记,进行逻辑删除),查找时还需要继续往后找
在这里插入图片描述
缺点:删除元素过多时还需要一个个对比
查找79
79%13=1
H1、H2…H9成功
8次冲突,对比关键字9次
在这里插入图片描述
4.查找效率分析ASL

ASL成功=(1+1+1+2+4+1+1+3+3+1+3+9)/12=2.5
在这里插入图片描述
在这里插入图片描述
查找失败需要走到底
初次探测地址H0只能在[0,12]
要查找的关键字映射到0的位置:需要对比1次
要查找的关键字映射到1的位置:需要对比13次

要查找的关键字映射到12的位置:需要对比2次
ASL失败=(1+13+12+11+10+9+8+7+6+5+4+3+2)/13=7

:若用mod表示key%13中的13
这里的分子的个数是mod(从0~mod-1),分母的值也是mod;而查找成功的分母为元素个数(12)

例:现有长度为 11 且初始为空的散列表 HT,散列函数是 H(key) = key % 7,采用线性探查 (线性探测再散列)法解决冲突。将关键字序列 87, 40, 30, 6, 11, 22, 98, 20 依次插入 HT 后, HT 查找失败的平均查找长度是 :(9+8+7+6+5+4+3)/7=6

(二)平方探测法

1.基本概念
di=0,1,-1,4,-4,9,-9
在这里插入图片描述
表长27
(1)插入19
19%13=6,冲突
H1=(6+1)%27=7成功插入
(2)插入32
32%13=6,冲突
H1=(6+1)%27=7冲突
H2=(6-1)%27=5成功插入
在这里插入图片描述
插入84
84%13=6
H1=7冲突
H2=5冲突
H3=10冲突
H4=2冲突
H5=(6+9)%27=15冲突
H6=(6-9)%27=(-3)%27=24
注:(-3)=(-1)×27+24
mod也把表看成循环表,6往左移动9位,5,4,3,2,1,0,26,25,24
在这里插入图片描述
插入成功
在这里插入图片描述
2.查找

查找71
在这里插入图片描述
71%13=6匹配失败
H1=7匹配失败
H2=5匹配失败
H3=10匹配失败
H4=2匹配失败
H5=15匹配成功

3.其他
平方探测法散列表的长度m必须可以表示成4j+3的素数,才能探测到所有位置
如:m=4×1+3=7可以
m=8不可以

(三)伪随机序列法

di是一个伪随机序列

如:di=0,5,24,11…
举例:
在这里插入图片描述
总结
在这里插入图片描述
六.再散列法

除了原始的散列函数H(key)之外,多准备几个散列函数,当散列函数冲突时,用下一个散列函数计算一个新地址,直到不冲突为止
Hi=RHi(key)
i=1,2,3,…,k

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卡__卡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值