例题(来源: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
按关键字序列顺序依次向哈希表中填入,发生冲突后按照“线性探测”探测到第一个空位置填入:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
7 | 14 | 8 | 11 | 30 | 18 | 9 |
第二步:计算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。
由此可得到如下数据:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
7 | 14 | 8 | 11 | 30 | 18 | 9 | |||
1 | 2 | 1 | 1 | 1 | 3 | 3 |
由上表可得:
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 |
由上表得到如下数据:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
7 | 14 | 8 | 11 | 30 | 18 | 9 | |||
3 | 2 | 1 | 2 | 1 | 5 | 4 |
由上表得:
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