题目:
1.设散列函数H(k)=k%13,设关键字系列为{22,12,24,6,45,7,8,13,21},要求用线性探测法处理冲突。
(1)构建HASH表
(2)分别求查找成功和不成功时的平均查找长度
答案:
(1)
(2)
查找成功的平均查找长度:(5*1+1*2+2*3+1*7)/9=20/9
查找不成功的平均查找长度:(2+1+9+8+7+6+5+4+3/13=48/13
解析:
使用线性探测法先求出关键字所在的位置,使用关键字%13得出所存储的位置,如果遇到冲突则(key+di)%13的计算方式得到关键字存储的位置。
(1)存入第一个元素22,由于h(22)=22%13=9,又因为3号位置没有数据,所以把22存入2号位置,探测次数为1;
(2)存入第二个元素12,由于h(12)=12%13=12,又因为12号位置没有数据,所以把12存入12号位置,探测次数为1;
(3)存入第三个元素24,由于h(24)=24%13=11,又因为11号位置没有数据,所以把24存入11号位置,探测次数为1;
(4)存入第四个元素6,由于h(6)=6%13=6,又因为6号位置没有数据,所以把6存入6号位置,探测次数为1;
(5)存入第五个元素45,由于h(45)=45%13=6,但6号位置已经被6占用,因此进行限行再散列Hi=(h(key)+di)%m,di=1,2,3,4.....。所以H1=(6+1)%13=7,7号位置没有数组,因此把45存入7号位置,探测次数为2;
(6)存入第六个元素7,由于h(7)=7%13=7,但7号位置已经被45占用,因此进行限行再散列Hi=(h(key)+di)%m,di=1,2,3,4.....。所以H1=(7+1)%13=8,8号位置没有数组,因此把7存入8号位置,探测次数为2;
(7)存入第六个元素8,由于h(8)=8%13=8,但8号位置已经被7占用,因此进行限行再散列Hi=(h(key)+di)%m,di=1,2,3,4.....。所以H1=(8+1)%13=9,9号位置也被数据占用,依此类推,H2=(8+2)%13=10,因此把8存入10号位置,探测次数为3;
(8)存入第八个元素13,由于h(13)=13%13=0,又因为0号位置没有数据,所以把13存入0号位置,探测次数为1;
(9)存入第九个元素21,由于h(21)=21%13=8,但8号位置已经被7占用,因此进行限行再散列Hi=(h(key)+di)%m,di=1,2,3,4.....。所以H1=(8+1)%13=9,9号位置也被数据占用,依此类推,H6=(8+6)%13=1,因此把21存入1号位置,探测次数为7;
通过以上推导得出答案中的结果。
平均查找长度 每个数的探测次数和/元素个数(5*1+1*2+2*3+1*7)/9=20/9
计算查找不成功的次数就直接找到关键字到一个地址上关键字为空的距离即可:
首先看0号地址上有关键字,第一个没有关键字的为2号地址;0号地址离 2号地址的距离为2;
1号地址上关键字离2号地址距离为1;
6号地址上关键字离2号地址的距离不是4,而是9;
。。。。。。。。。
依此类推
12号地址上关键字离2号地址的距离为3;
查找不成功的平均查找长度:(2+1+9+8+7+6+5+4+3)/13=45/13