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就插到这个位置。

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

address 0 1 2 3 4 5 6 7 8 9
key 7 14 8 11 30 18 9

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

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

  1. 求一颗二叉排序树查找成功和失败情况下的平均查找长度

    /** *    实验题目: *        求一颗二叉排序树查找成功和失败情况下的平均查找长度 *    实验目的: *        掌握二叉排序树的查找过程及其算法设计 *    实验内容: ...

  2. Hash表(哈希表、散列表)

    哈希表 概念 为什么需要哈希表 静态查找表与动态查找表中,为了查找某关键字值等于某个值的记录,都要经过一系列的关键字进行比较,以确定待查记录的储存位置或查找失败,查找的时间总是与比较次数有关 什么是哈 ...

  3. hash表与系统顺序寻址

    hash表即散列表,它是基于高速存取的角度设计的,也是一种典型的"空间换时间"的做法.顾名思义,该数据结构能够理解为一个线性表,可是当中的元素不是紧密排列的,而是可能存在空隙. 散 ...

  4. 反向页表(基于hash表)

     反向页表:顾名思义,以页帧号为index,页号地址为value,每次访问将value和逻辑地址比对,这样做的原因就是大大节省了内存的开销,全局只需要一张页表,但是当物理内存特别大的时候,这个表也就很 ...

  5. 哈希表查找——成功和不成功时的平均查找长度

    哈希表查找--成功和不成功时的平均查找长度 以下求解过程是按照"计算机统考的计算方法",不同的老师.教材在"处理冲突"上可能会有不同的方法,所以最主要的是掌握原 ...

  6. 哈希表等概率情况下查找成功和查找不成功的平均查找长度的计算

    最近复习了下数据结构中的哈希表,发现在计算等概率情况下查找不成功的平均查找长度时比较迷茫,不知道到底是怎么计算出来的.现在通过查阅资料终于知道如何计算了,所以记录下来以供以后查阅. 下面看下2010年 ...

  7. 哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度

    哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度 了解ASL的公式 线性探测法求ASL 链地址法求ASL 了解ASL的公式 查找成功时:ASL =1n\frac{1}{n}n1​ ∑i=1 ...

  8. 哈希表查找——等概率情况下查找成功和查找不成功的平均查找长度的计算

    最近复习数据结构中的哈希表,发现在计算等概率情况下查找不成功的平均查找长度时不太理解,不知道到底是怎么计算出来的.看了几篇博客后终于知道如何计算了,总结如下. 例题: 将关键字序列(7.8.30.11 ...

  9. 探究如何计算哈希表查找成功、失败时的平均查找长度(附实例)

    对于查找成功时的平均查找长度,书上有明确的定义: 而题目设定条件都是在等概率下查找,所以ASL=(C0+C1+...+Cn)*1/n. 这就说明了查找成功是针对关键字查找的,最后除以关键字的总个数. ...

最新文章

  1. 模拟linux磁盘满,linux 磁盘满了简单处理一下
  2. 百架无人机“失控撞楼”,程序员写的 Bug?
  3. node 加密解密模块_NODE.JS加密模块CRYPTO常用方法介绍
  4. java 轻量级文件数据库_Java:如何创建轻量级数据库微服务
  5. oracle idm_批准Oracle IDM中的特定Web服务
  6. jupyter 无法提示代码,报错TypeError: __init__() got an unexpected keyword argument ‘column‘
  7. 如何为SharePoint添加一个简单地SMTP邮件发送服务器?
  8. 计算机科学与技术志愿意愿,高考志愿填报如何得高分
  9. 电子设计大赛-仪器仪表类题目分析
  10. LDAP认证-ldap介绍
  11. 部分免费开放的电子图书馆
  12. Kinect2.0相机标定
  13. java adsl 拨号_[zt]利用脚本实现ADSL自动拨号上网
  14. graphite快速搭建手册
  15. 【系统测试报告】苏科大App系统测试报告
  16. c语言1 2.5*3,若有如下变量定义并赋值:inta=1,b=2,c=3,k;float f=2.5,e;doubled=2.4,g;则下列符合C语言语法的...
  17. 如何找回被盗QQ里丢失的好友
  18. 远程控制电脑的软件哪个比较好用
  19. Linux Nginx安装配置及HTTPS配置
  20. 怎样使用Outlook发送电子邮件,Outlook发送邮件步骤是什么?

热门文章

  1. 好工具推荐---radmin viewer3.5正式版
  2. 通过QQ查看对方地址
  3. PL/SQL之块结构和组成元素
  4. verycd 动态标题收藏
  5. 利用Stylish自定义safari护眼模式
  6. html格式怎么转换mp3,mp3支持什么音频格式_mp3音频格式怎么转换-太平洋IT百科手机版...
  7. 3.Python数据分析项目——工资分类预测
  8. 最大公约数(二进制算法)
  9. 20200225使用老毛桃写入WIN10专业版到U盘
  10. RocketMQ系列:搭建3m-noslave模式的rocketmq集群