哈希表等查找成功和查找不成功的平均查找长度(线性探测法+链地址法)

最近刷面试题遇到哈希表求平均查找长度的题,发现已经忘了,查阅网上很多资料,发现关

于求查找不成功的平均查找长度,说法很多,我来借网上一篇的文章,阐述下我自己的

拙见,有什么不对的地方,欢迎大家在评论区指教~讨论

Question1:

将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中。散列表的存储空间是一

个下标从0开始的一维数组,散列函数为:      H(key) = (keyx3) MOD 7,处理冲突采用线性

探测再散列法,要求装填(载)因子为0.7。

(1) 请画出所构造的散列表

(2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。

Ans:

(1).首先明确一个概念装载因子,装载因子是指所有关键子填充哈希表后饱和的程度,

装载因子=关键字总数/哈希表的长度 根据题意,我们可以确定哈希表的长度为 L = 7/0.7

= 10;因此此题需要构建的哈希表是下标为0~9的一维数组。根据散列函数可以得到如下散

列函数

值表。

H(Key) = (keyx3) MOD 7, 例如key=7时, H(7) = (7x3)%7 = 21%7=0,其他关键字同理。

Key78301118914
H(Key)0365560

(表1)

采用线性探测再散列法处理冲突,所构造的散列表为:

地址0123456789
关键字714 8 1130189 

(表2)

下面对散列表的构造方式加以说明,注意表1中的关键字7和14,30和9, 11和18,这三组

关键子的H(Key)值相同,这在构建散列表时就会产生冲突,因为他们的地址相同,所以要通

过一定的冲突处理方法来解决这个问题。依题,采用线性探测再散列法处理冲突。下面详细

介绍如何构建散列表:

       第一个key 7,它的地址是0,因此放到散列表的数组下表为0的位置,这个位置上没有

关键字,因此没有冲突可以直接填入;

       第二个key 8,它的地址是3,因此放到散列表的数组下表为3的位置,这个位置上没有关键字,因此没有冲突可以直接填入;

       第三个key 30,它的地址是6,因此放到散列表的数组下表为6的位置,这个位置上

没有关键字,因此没有冲突可以直接填入;

       第四个key 11,它的地址是5,因此放到散列表的数组下表为5的位置,这个位置上没有

关键字,因此没有冲突可以直接填入;

       第五个key 18,它的地址是5,因此放到散列表的数组下表为5的位置,但这个位置上已

经有关键字11,遇到了冲突,此时我们根据线性探测再散列法来处理这个冲突,探测下一个

位置6, 6这个位置上已经存在关键字30则继续增加步长1,因此现在的新地址应为7,位置7

上没有关键字,放入即可,到此冲突已经解决;

       第六个key 9,它的地址是6,因此放到散列表的数组下表为6的位置,但这个位置上已

经有关键字30,遇到了冲突,探测下一个位置7, 7这个位置上已经存在关键字18则继续增加

步长1,因此现在的新地址应为8,位置8上没有关键字,放入即可;   

       第七个key 14,它的地址是0,因此放到散列表的数组下表为0的位置,但这个位置上已

经有关键字7,遇到了冲突,探测下一个位置1, 位置1上没有关键字,放入即可;   

       到这一步所有关键字均已填入,散列表已经构造完成,如表2所示。

(2)等概率情况下查找成功平均查找长度:

        这一问可以根据第一问的构造过程求解:

        key7一次就填入了表中,因此查找次数为1,同理8, 30, 11查找次数均为1; key18

进行了3次放入操作,探测位置分别是5,6,7 ,因此查找次数为3;key9也是3次;key14

进行了两次探测,因此查找次数为2。次数表如表3所示

Key78301118914
Count1111332

(表3)

        所以ASLsuccess= (1+1+1+1+3+3+2)/ 7 = 12/7。  

等概率情况下查找不成功的平均查找长度:
地址0123456789
关键字714 8 1130189 

(表2)

        接下来讨论不成功的情况, 看表2,计算查找不成功的次数就直接找关键字到

一个地址上关键字为空的距离即可, 但根据哈希函数地址为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,到第一个关键为空的地址9的距离为5,因此查找不成功的次数为5.

        地址6,到第一个关键为空的地址9的距离为4,因此查找不成功的次数为4.

        因此查找不成功的次数表如下表所示

Key78301118914
Count3212154
(表4)

       所以ASLunsuccess= (3+2+1+2+1+5+4)/ 7 = 18/7。

 

注意:这里的分母7,网上说法很多,有说关键字个数的,也有说哈希表长度的,但是个人

认为,都不是,这里的7,与散列函数有关,也就是与MOD7有关,也就是查找不成

功时的地址的个数,MOD7,地址区间为0~6,地址数为7。

总结

  1. 装填因子 = (哈希表中的记录数) / (哈希表的长度)

  2. 查找成功时的ASL计算

    ASL= 插入关键字时的比较次数 / 关键字个数

  3. 查找不成功时的ASL计算

    ASL = 查找不成功的比较次数 / 查找不成功时的地址个数

  • 25
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值