Hash表查找成功和查找不成功的平均查找长度(附总结)

Hash表的平均查找长度包括查找成功时的平均查找长度和查找失败时的平均查找长度。
  查找成功时的平均查找长度=表中每个元素查找成功时的比较次数之和/表中元素个数
查找不成功时的平均查找长度相当于在表中查找元素不成功时的平均比较次数,可以理解为向表中插入某个元素,该元素在每个位置都有可能,然后计算出在每个位置能够插入时需要比较的次数,再除以表长即为查找不成功时的平均查找长度

下面举个例子:
将关键字序列{7, 8, 30, 11, 18, 9, 14}散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组,长度为10,即{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}。散列函数为: H(key) = (key * 3) % 7,处理冲突采用线性探测再散列法。
求等概率情况下查找成功和查找不成功的平均查找长度。

解:

1 求散列表

H(7) = (7 * 3) % 7 = 0
H(8) = (8 * 3) % 7 = 3
H(30) = 6
H(11) = 5
H(18) = 5
H(9) = 6
H(14) = 0

按关键字序列顺序依次向哈希表中填入,发生冲突后按照“线性探测”探测到第一个空位置填入。
H(7) = 0,key = 7应插在第0个位置,因为第0个位置为空,可以直接插入。
H(8) = 3,key = 8应插在第3个位置,因为第3个位置为空,可以直接插入。
H(30) = 6,key = 30应插在第6个位置,因为第6个位置为空,可以直接插入。
H(11) = 5,key = 11应插在第5个位置,因为第5个位置为空,可以直接插入。
H(18) = 5,key = 18应插在第5个位置,但是第5个位置已经被key=11占据了,所以往后挪一位到第6个位置,但是第6个位置被key=30占据了,再往后挪一位到第7个位置,这个位置是空的,所以key=18就插到这个位置
H(9) = 6,key = 9应插在第6个位置,但是第6个位置已经被key = 30占据,所以需要往后挪一位到第7个位置,但是第7个位置已经被key = 18占据,所以再往后挪移到第8个位置,这个位置是空的,所以key = 9就插到这个位置。
H(14) = 0,key = 14应插在第0个位置,但第0个位置已被key=7占据,所以往后挪移一位到第1个位置,这个位置是空的,所以key=14就插到这个位置。

最终的插入结果如下表所示:

address0123456789
key71481130189

2 求查找成功的平均查找长度

查找7,H(7) = 0,在0的位置,一下子就找到了7,查找长度为1。
查找8,H(8) = 3,在3的位置,一下子就找到了8,查找长度为1。
查找30,H(30) = 6,在6的位置,一下子就找到了30,查找长度为1。
查找11,H(11) = 5,在5的位置,一下子就找到了11,查找长度为1。
查找18,H(18) = 5,第一次在5的位置没有找到18,第二次往后挪移一位到6的位置,仍没有找到,第三次再往后挪移一位到7的位置,找到了,查找长度为3。
查找9,H(9) = 6,第一次在6的位置没找到9,第二次往后挪移一位到7的位置,仍没有找到,第三次再往后挪移一位到8的位置,找到了,查找长度为3.
查找14,H(14) = 0,第一次在0的位置没找到14,第二次往后挪移一位到1的位置,找到了,查找长度为2。

所以,查找成功的平均查找长度为(1 + 1 + 1 + 1 + 3 + 3 + 2) / 7 = 12 / 7。

3 求查找不成功的平均查找长度

查找不成功,说明要查找的数字肯定不在上述的散列表中。
因为这里哈希函数的模为7,所以要查找的数的初始地址只可能位于0~6的位置上。
地址0,到第一个关键字为空的地址2需要比较3次,因此查找不成功的次数为3。比如要查找的数为28,H(28) = (28 * 3) % 7 = 0。即28对应的地址是0,由于存放在0位置的数是7,所以往后挪移一位,发现在1位置存放的数是14,继续往后挪一位,发现位置2上没有数。至此就知道28不在这个哈希表里,即查找28失败。
地址1,到第一个关键字为空的地址2需要比较2次,因此查找不成功的次数为2。
地址2,到第一个关键字为空的地址2需要比较1次,因此查找不成功的次数为1。
地址3,到第一个关键字为空的地址4需要比较2次,因此查找不成功的次数为2。
地址4,到第一个关键字为空的地址4需要比较1次,因此查找不成功的次数为1。
地址5,到第一个关键字为空的地址9需要比较5次,因此查找不成功的次数为5。
比如要查找的数为4,H(4) = (4 * 3) % 7 = 5,所以从地址5开始查找,最终发现地址5、地址6、地址7、地址8上存放的数都不是5,并且地址9的位置上没放数据,至此可知5不在这个哈希表里。
地址6,到第一个关键字为空的地址9需要比较4次,因此查找不成功的次数为4。
所以,查找不成功的平均查找长度为(3 + 2 + 1 + 2 + 1 + 5 + 4)/ 7 = 18 / 7。

注意

为了提高阅读和理解的效率,在这边强调一下:

  • 求成功的ASL是针对于每个数字的,即你要把所有数字的查找后的次数做个累加,最后除的数字是元素的个数!这个很好理解,因为我们研究的也是所有元素的查找次数。
  • 求不成功的ASL针对的是每个位置!即每个位置往后找第一个为空的位置所比较的次数,然后累加最后除以哈希表的规模(如果是除留余数法,这个规模就是那个模数)。显然,这里的每个位置是要在哈希表内的位置,即你使用的哈希函数求出的所有可能的位置,对于除留余数法哈希表的大小取决于你选的那个p(大部分情况下是质数),而不是本身数组的大小。具体原因可以看上面那个例子,或者这里再举个例子:假如你模的是2,显然哈希函数算出来的数字非0即1,只有这两个位置,即使你存放的空间由10000,哈希表的大小还是只有2,所以你最后除的分母仍是2而不是10000。

版权声明:本文为CSDN博主「海天一树」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/haishu_zheng/article/details/77278119

  • 98
    点赞
  • 231
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值