软考考点之散列表(哈希)等概率平均查找长度

题目:关键字序列为:{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)线性探测法:

地址0123456789101112
关键字140142275532204553232410
成功查找次数121431139113
不成功查找次数

查找成功时的查找次数等于插入元素时的比较次数,查找成功的平均查找长度为:
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

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

  • 19
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

guangod

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

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

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

打赏作者

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

抵扣说明:

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

余额充值