<数据结构>线性探测法处理冲突时查找成功和失败的ASL计算方法

Hash表线性探测处理法


关键字序列序列{26,36,41,38,44,15,68,12,6,51,25},除留余数法构造哈希函数,线性探测再散列处理冲突,α=0.75。

1.表长m为关键字个数n/α向上取整,m = 15。则相对地址为0 ~ 14。寻找小于14的最大素数,为13,因此模取13。

H(26) = 26 % 13 = 0
H(36) = 36 % 13 = 10
H(41) = 41 % 13 = 2
H(38) = 38 % 13 = 12
H(44) = 44 % 13 = 5
H(15) = 15 % 13 = 2
出现冲突,线性探测处理。即从2位置向右寻找,第一个位置(3)如果为空,就存进3中,否则查看4,4为空存进4中,否则查看5…此处3为空,15存进3中
H(68) = 68 % 13 = 3
3在上一步中被15占用,即使68本来的位置应该是3,也不能存进去。同样依次向右查找,直到找到一个位置为空可以存入。第一个位置(4)没有元素,存入68。
H(12) = 12 % 13 = 12
出现冲突。重复以上步骤。13没有元素,存入。
H(6) = 6 % 13 = 6
H(51) = 51 % 13 = 12
出现冲突。重复以上步骤,存入14
H(25) = 25 % 13 = 12
出现冲突。重复以上步骤。13,14均满,从0再开始寻找没有存入元素的位置,即1。25存入1中。
得到结果
除留余数法构造哈希函数

2.查找哈希表的操作和构造哈希表的方式相关。也就是说,如果哈希表处理冲突采取的是线性探测的方法,即存储位置相同时往该位置右边找空,找到表末尾没找到的话再从0开始找,那么查找的时候,如果要查找的元素,根据哈希函数的映射的地址上存储的元素和该元素不同,那么同样向右寻找,和右边的数值依次比较直到成功或者失败。
如果采取的是二次探测的方法处理冲突(用左右横跳来形容是不是比较贴切…我的神奇脑洞ORZ),那么查找的时候就是从哈希函数映射的地址左右比较,先比较右边第一个元素,再比较左边第一个元素,再比较右边第二个元素,再比较左边第二个元素……直到比较成功或者失败。

3.成功时的ASL计算,分母是元素个数n,分子是各元素需要比较的次数之和。
ASL成功

4.失败时的ASL计算,相比于成功时的有那么一丢丢的难以理解。
比如,我要查一个根据哈希函数映射后地址为0的数据,假如是65, (65 % 13 = 0),此时0位置存的是26,不相等。让我们回想一下,在26占据了0位置之和,其他映射后地址为0的数据是怎样处理的?(答案是向右找空),那么查找时还是一样,要向右查找,看位置1,1中存储的是25,依旧不相等,接着往右查,一直查到地址6,还是没有65这个数值,接着往右,位置7中没有元素,也就是说,65不在这个关键字序列中。查找失败,比较了8次。再来看位置1,假如要查14(14 % 13 = 1),首先和位置1中的25比较,不同,然后向右查找,直到比较到位置7,查找失败,14不在关键字序列中,比较了7次。也就是说,查找失败情况下比较的次数,是该元素到其右边第一个空白位置的距离,(位置0到位置7,长度为8)。

接下来是位置7,8,9,这三个空间的比较次数分别是1,举个例子,我要查20,(20 % 13 = 7),将20和7中的元素比较(7中无元素,也就是20不在该关键字序列中),比较了1次。然后是位置10,和右边第一个为空的位置长度为2。

接下来就是这个题目比较难的地方之一了,位置12查找失败时比较了多少次呢?这里就要考虑到mod(取模%)的作用了,联系循环队列中的%,%的作用是把rear指针从数组的高位变到了低位使得整个数组循环了起来。(数组长为7时,rear为6,之后的(rear+1)%7=0将rear变到了0位置),同样,这里的取模也造成了一种“循环”的结果。因此,位置12要比较的次数,是其右边的元素个数+从0开始到第一个空白的个数,即位置12,13,14,0,1,2,3,4,5,6,7,共11次。

第二个难点,位置13,14要不要考虑呢?答案是不需要。一个解释方式是通过哈希函数来解释,哪个数字经过哈希函数的映射之后能映射到13或者14?即哪个数字对13取模之后能得到13或者14?这个数字是不存在的,也就是说根本就不存在能够通过哈希函数映射到13或者14的元素,也就不会有查找失败了。这也是为什么ASL的分母是13的原因:要查找的所有元素的哈希函数映射都在0~12内。那为什么13或者14中存在元素呢?被前面的数字“推过来”的呗。你看存入13,14的元素,12和51是不是应该存到12和12的位置。所以,13和14计入从其他位置开始的比较次数(分子),但是不从自身开始计算比较次数,也不计入分母。分母是模长。
ASL失败

  • 83
    点赞
  • 241
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值