coding A&D:计算哈希表 - 线性探测法、拉链法 - ASL成功、ASL不成功

例题(来源:2010年全国统考专业课408 第一题)

一. 哈希表—线性探测法的ASL成功、不成功计算
将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组。散列函数为: H(key) = (keyx3) MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。
(1) 请画出所构造的散列表;
(2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。

【分析】

第一步:求散列表

由α = 表中填入的记录数/哈希表长度,可得:哈希表长度 = 7/0.7 = 10

 H(7) = (7x3) MOD 7 = 0          

H(8) = (8x3) MOD 7 = 3          

H(30) = (30x3) MOD 7 = 6

H(11) = (11x3) MOD 7 = 5      

H(18) = (18x3) MOD 7 = 5      

H(9) = (9x3) MOD 7 = 6           

H(14) = (14x3) MOD 7 = 0

按关键字序列顺序依次向哈希表中填入,发生冲突后按照“线性探测”探测到第一个空位置填入:

0123456789
714 8 1130189 

第二步:计算ASL成功、ASL不成功

「ASl查找成功」(待查找的数字肯定在散列表中才会查找成功)

查找数字A的长度 = 需要和散列表中的数比较的次数;
步骤:
                比如 查找数字:8
                则  H(8) = (8x3) MOD 7 = 3
                哈希表中地址3处的数字为8,进行了第一次比较:8 = 8,则查找成功,查找长度为1;
                比如查找数字:14
                则 H(14) = (14x3) MOD 7 = 0
                哈希表中地址0处的数字为7,进行第一次比较:7≠14
                哈希表中地址1处的数字为14,进行第二次比较:14=14 ,则查找成功,查找长度为2。                             

由此可得到如下数据:

0123456789
714 8 1130189 
12 1 1133 

由上表可得:

ASL成功 = (1+1+1+1+3+3+2)/7 = 12/7

「ASL查找不成功」(待查找的数字肯定不在散列表中)

 

【解题的关键之处】根据哈希函数地址为MOD7,因此任何一个数经散列函数计算以后的初始地址只可能在0~6的位置;

查找0~6位置查找失败的查找次数为:

地址0,到第一个关键字为空的地址2需要比较3次,因此查找不成功的次数为3
地址1,到第一个关键字为空的地址2需要比较2次,因此查找不成功的次数为2
地址2,到第一个关键字为空的地址2需要比较1次,因此查找不成功的次数为1
地址3,到第一个关键字为空的地址4需要比较2次,因此查找不成功的次数为2
地址4,到第一个关键字为空的地址4需要比较1次,因此查找不成功的次数为1
地址5,到第一个关键字为空的地址2(比较到地址6,再循环回去)需要比较5次,因此查找不成功的次数为5
地址6,到第一个关键字为空的地址2(比较到地址6,再循环回去)需要比较4次,因此查找不成功的次数为4

由上表得到如下数据:

0123456789
714 8 1130189 
3212154   

由上表得:

ASL不成功 = (3+2+1+2+1+5+4)/7 = 18/7

二. 哈希表-拉链法ASL成功、不成功计算

例题:

假设散列表的长度是13,三列函数为H(K) = k % 13,给定的关键字序列为{32, 14, 23, 01, 42, 20, 45, 27, 55, 24, 10, 53}。分别画出用线性探测法和拉链法解决冲突时构造的哈希表,并求出在等概率情况下,这两种方法的查找成功和查找不成功的平均查找长度。

【分析】

先利用散列函数(一般是取余数的方法)定位数组具体哪个点,比如1就是余数为1的点的链表中,然后再遍历链表查找具体数值的位置,如,果是53,那就在链表的第四位置,需要查找四次;同理,27就需要查找3次!

技术分享

查找成功时的平均查找长度:

ASL = (1*6+2*4+3*1+4*1)/12 = 7/4

查找不成功时的平均查找长度:

ASL = (4+2+2+1+2+1)/13

注意:查找成功时,分母为哈希表元素个数,查找不成功时,分母为哈希表长度。

 

 

其他练习题:

https://blog.csdn.net/longlovefilm/article/details/78009782

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值