题目:关键字序列为:{38,25,74,63,52,48},哈希函数为H(k)=k%7,哈希表的长度为7,用线性探测和链地址法处理冲突,分别计算等概率情况下查找成功的平均查找长度。
注:没给哈希表长度,给出装填因子时,可求哈希表长度,
可根据此公式装填因子=元素个数/表长推:表长=元素个数/装填因子。
如:现在元素个数为7个,若给出装填因子为 0.7的话,散列表的大小就为7/0.7=10个
线性探测法
由上构造的哈希表如下:
等概率下查找成功的平均查找长度为:
ASL=(1+3+1+1+2+4)/6=2//这里的数据一共是6个,所以除以6,不要写成是散列表的长度
链地址法
由上构造的哈希表如下:
等概率下查找成功的平均查找长度为:
ASL=(1*4+2*2)/6=1.3//从构造的哈希表可以看出,63,38,25,48,探查一次所以是1*4,52,74探查两次,所以是2*2.
扩展:
不同处理冲突的平均查找长度
例:
假设散列表的长度是13,三列函数为H(K) = k % 13,给定的关键字序列为{32, 14, 23, 01, 42, 20, 45, 27, 55, 24, 10, 53}。分别画出用线性探测法和拉链法解决冲突时构造的哈希表,并求出在等概率情况下,这两种方法的查找成功和查找不成功的平均查找长度。
(1)线性探测法:
地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
关键字 | 14 | 01 | 42 | 27 | 55 | 32 | 20 | 45 | 53 | 23 | 24 | 10 | |
成功查找次数 | 1 | 2 | 1 | 4 | 3 | 1 | 1 | 3 | 9 | 1 | 1 | 3 | |
不成功查找次数 |
查找成功时的查找次数等于插入元素时的比较次数,查找成功的平均查找长度为:
ASL = (1+2+1+4+3+1+1+3+9+1+1+3)/12 = 2.
查找不成功的平均查找长度为:(待查找的数字肯定不在散列表中)
步骤为:
查找0~12位置查找失败的查找次数为:
地址0,到第一个关键字为空的地址0需要比较1次,因此查找不成功的次数为1.
地址1,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较13次,因此查找不成功的次数为13.
地址2,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较12次,因此查找不成功的次数为12..
地址3,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较11次,因此查找不成功的次数为11..
地址4,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较10次,因此查找不成功的次数为10..
地址5,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较9次,因此查找不成功的次数为9..
地址6,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较8次,因此查找不成功的次数为8..
地址7,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较7次,因此查找不成功的次数为7..
地址8,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较6 次,因此查找不成功的次数为6
地址9,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较5次,因此查找不成功的次数为5
地址10,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较4次,因此查找不成功的次数为4
地址11,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较3次,因此查找不成功的次数为3
地址12,到第一个关键字为空的地址0(比较到地址12,再循环回去)需要比较2次,因此查找不成功的次数为2
ASL = (1+2+3+4+5+6+7+8+9+10+11+12+13)/ 13 = 91/13
(2)链地址法
查找成功时的平均查找长度:
ASL = (1*6+2*4+3*1+4*1)/12 = 7/4
查找不成功时的平均查找长度:
注:指针为空的地址不用比较就可以知道不存在。所以只需要比较指针为空的前面的比较的数据个数就是查找失败的个数。如地址1,有四个元素,最后一个元素的地址就为空,所以前面是需要比较4个数,所以是探查4次。
ASL = (4+2+2+1+2+1)/13
注意:查找成功时,分母为哈希表元素个数,查找不成功时,分母为哈希表长度。