哈希表(散列表)的平均查找成功/失败长度

这篇具有很好参考价值的文章主要介绍了哈希表(散列表)的平均查找成功/失败长度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

计算哈希地址的方法,称之为哈希函数。
常见的计算哈希地址方法有:
1、直接定址法
2、除留余数法
3、数字分析法
4、平方取中法

本文所分析的是使用除留余数法计算哈希地址这类,的平均查找成功长度和查找失败长度


对于除留余数法的哈希函数(散列函数)
H(key) = key % p(n)
p(n)为不超过表长的最大素数。

如何计算平均查找/失败长度?
哈希表可以使用闭散列(开放定址法),也可以使用开散列(拉链法,哈希桶)进行构造。目前我在哈希中所遇到过的让计算平均查找成功/失败长度的情况,只有使用闭散列的线性探测构造的散列表 和 拉链法构造的散列表。


拉链法构造的散列表

查找成功的平均查找长度(拉链法)

计算查找成功的平均查找长度的前提,是查找成功,意味着能够在当前的散列表中找到。

查找到每一个位置上的概率为 1/总数据元素个数

查找了1层就查找成功概率P1为:
(1 / 总数据元素个数 )* 第一层的数据元素个数
查找了2层就查找成功的概率P2:
(1 / 总数据元素个数)* 第2层的数据元素个数

查找了n层长度的查找成功的概率Pn为:(1 / 总数据元素个数)* 第n层的数据元素个数

查找成功的平均查找长度 = P1 * 1 + P2 * 2 + P3 *2 + … + Pn * n

例如:
哈希表(散列表)的平均查找成功/失败长度
一共有11个数据元素,查找成功一定会找到这11个数据元素的位置上,那么落在这些位置上的概率都是1/11。
第一层有7个数据元素,所以找一层就找到了的概率为7 / 11
第二层有2个数据元素,所以找二层就找到了的概率为2 / 11

根据数学期望的知识
可知查找成功的平均查找长度ASL = 7/11 * 1 + 2/11 * 2 + 1/11 * 3 + 1/11 * 4 = 18/11

查找失败的平均查找长度(拉链法)

计算查找失败的平均查找长度的前提,是查找失败,意味着我们查找的位置一定落在没有数据的位置上。注意:查找到0层,意味着通过计算的哈希地址去找,这个哈希地址下根本没有数据元素。
查找了0层就查找失败的概率P0:(1 / 查找失败可能落在的位置总个数)* 第0层的查找失败可能落在的位置个数
查找了1层就查找失败的概率P1:(1 / 查找失败可能落在的位置总个数)* 第1层的查找失败可能落在的位置个数
查找了2层就查找失败的概率P2:(1 / 查找失败可能落在的位置总个数)* 第2层的查找失败可能落在的位置个数

查找了n层就查找失败的概率Pn:(1 / 查找失败可能落在的位置总个数)* 第n层的查找失败可能落在的位置个数。

查找失败的平均查找长度 = P0*0 + P1 * 1 + P2 * 2 + P3 *2 + … + Pn * n

例如:
哈希表(散列表)的平均查找成功/失败长度
当我们按照规则去查找的时候,找到下面红色圈圈标起来的位置时,就说明要找的数据不在散列表中,所以上图查找失败可能落在的位置总个数为13。那么在查找失败的前提下,落在圈起来的位置上的每一个概率都是1/13
哈希表(散列表)的平均查找成功/失败长度
当我们计算出来的哈希位置,根本没有数据,压根不需要找就知道它不在 ===> 查找0层就查找失败了。
此例中查找了0层就查找失败的概率P0 = 6 * (1 / 13) = 6/13

哈希表(散列表)的平均查找成功/失败长度
查找了1层就查找失败的概率P1 = 5* (1 / 13) = 5/13
哈希表(散列表)的平均查找成功/失败长度
查找了2层就查找失败的概率P1 = 1* (1 / 13) = 1/13
哈希表(散列表)的平均查找成功/失败长度
查找了4层就查找失败的概率P1 = 1* (1 / 13) = 1/13
哈希表(散列表)的平均查找成功/失败长度
所以查找失败的平均查找长度ASL = 6/13 * 0 + 5/13 * 1 + 1/132 + 1/134 = 11/13

线性探测构造的散列表

使用线性探测来构造散列表,首先使用哈希函数计算出哈希地址后,如果出现哈希冲突,那么依次向后去寻求一个空位置来存放。

查找失败的查找平均长度(线性探测)

注意:查找失败的情况,不是根据哈希表中实际存储的有效数据个数,也不是根据哈希表的长度来计算的。

计算查找失败的平均长度取决于
1.哈希函数
2.空位置

为什么?为了不那么晦涩,我使用实际的例子进行说明。(这里的空位置就是没有保存数据,没有被标记删除)
哈希表(散列表)的平均查找成功/失败长度
回顾线性探测,哈希的查找过程:首先使用哈希函数计算出哈希地址,从哈希地址开始进行查找,如果当前不存在则向后依次去查找,一直到查找到正确位置或者找到了空位置为止,而找到空位置时也说明了我们要查找的数据元素根本不在该哈希表内。

假设我们给出的哈希函数是H(key) = (key*3)%7
对于一个数去%7,算出来的值不会超过7,故而查找时计算出的哈希地址只可能是0、1、2、3、4、5、6

假设我们要查找一个关键字m,计算出的哈希地址为0,
1.先去探测哈希地址0,发现不是,
2.去探测哈希地址1,发现不是
2.去探测哈希地址2,发现是空位置
发现是空的,说明查找失败了
哈希表(散列表)的平均查找成功/失败长度
因此计算出的哈希地址为0的关键字,在该哈希表中查找失败的长度为3
同理,计算出的哈希地址为1的关键字,在该哈希表中查找失败的长度为2
哈希表(散列表)的平均查找成功/失败长度
计算出的哈希地址为2的关键字,在该哈希表中查找失败的长度为1
哈希表(散列表)的平均查找成功/失败长度
计算出的哈希地址为3的关键字,在该哈希表中查找失败的长度为2
哈希表(散列表)的平均查找成功/失败长度

根据上述的推导过程,我们就可以得出查找失败的所有情况。
哈希表(散列表)的平均查找成功/失败长度
故而,查找失败的情况只取决于哈希函数和空位置。
而对于一个需要查找的关键字,在还不知道具体数值的情况下,我们认为它计算出来的哈希地址落在每一个地址(0~6)的概率都相同,即1/7

根据数学期望的知识,可知查找失败的平均查找长度为:
ASL = 3*(1/7)+ 2*(1/7)+1*(1/7)+2*(1/7)+1*(1/7)+5*(1/7)+4*(1/7)=18/7

查找成功的查找平均长度(线性探测)

查找成功,说明我们要找的关键字一定是该哈希表中已经存在的。
哈希表(散列表)的平均查找成功/失败长度
该哈希表中一共有7个有效数据元素,那么在等概率情况下和查找成功的前提下,落在每一个有效数据位置的概率为1/7.假设我们给出的哈希函数是H(key) = (key*3)%7

如果我们查找的是7,7的哈希地址是(7*3)%7= 0,从哈希地址0开始探测,探测一次,就找到了
如果我们查找的是14,14的哈希地址是0,从哈希地址0开始探测
1.探测哈希地址0,发现不是
2.探测哈希地址1,发现是
所以查找14的探测(查找)长度为2

根据上述的推导过程,我们就可以得出查找成功的所有情况。
哈希表(散列表)的平均查找成功/失败长度
而查找成功的前提下,并且等概率的情况下,查找的是其中某一个关键字的概率是1/7
根据数学期望的知识,可以得出:
查找成功的平均查找长度ASL=1*(1/7)+2*(1/7)+1*(1/7)+1*(1/7)+1*(1/7)+3*(1/7)+3*(1/7)= 12/7文章来源地址https://www.toymoban.com/news/detail-465890.html

到了这里,关于哈希表(散列表)的平均查找成功/失败长度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ftp连接成功, 读取目录列表失败, 是什么原因?

    在linux云服务器搭建FTP服务器,直接使用宝塔面板简单粗暴,安全组记得放行(FTP:21端口,8888端口由宝塔web访问界面) 用filezilla、FTP Rush、 xftp等软件连接阿里云的虚拟主机服务器的FTP的时候,一直出现这个错误,读取目录列表失败,或者无法显示远程目录。 网上一堆抄来抄去

    2024年02月15日
    浏览(29)
  • 计算 Python 列表的平均值

    计算 Python 列表的平均值 在 Python 中,我们可以使用多种方法计算列表的平均值。这里将介绍两种常用的方法。 第一种方法是直接使用 Python 的内置函数 sum() 和 len() 。这两个函数分别用于计算列表中所有元素的和,以及列表的长度。我们可以使用这两个函数来计算列表的平均

    2024年02月08日
    浏览(27)
  • 【云计算与大数据计算】Hadoop MapReduce实战之统计每个单词出现次数、单词平均长度、Grep(附源码 )

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 下面通过WordCount,WordMean等几个例子讲解MapReduce的实际应用,编程环境都是以Hadoop MapReduce为基础 WordCount用于计算文件中每个单词出现的次数,非常适合采用MapReduce进行处理,处理单词计数问题的思路很简单,在 Map阶段处理每

    2024年02月16日
    浏览(34)
  • Python中计算列表平均值的方法

    列表(list)是Python中一种常用的数据结构,它允许我们存储多个元素。当我们需要计算列表中元素的平均值时,可以使用以下方法。 方法一:使用循环求和 我们可以使用循环遍历列表中的每个元素,并将它们相加,然后将结果除以列表的长度即可得到平均值。下面是使用循

    2024年02月05日
    浏览(41)
  • C语言 哈希查找(哈希表的创建、处理冲突、查找等)

    哈希查找(Hash Search) 是一种基于哈希表实现的数据查找算法,也可以被称为散列查找。 在哈希查找中,首先根据给定的键值通过哈希函数计算出对应的哈希值,然后利用该哈希值在哈希表中定位到具有相同哈希值的一个桶(Bucket),再在桶中进行线性查找和比较,以确定目

    2024年02月04日
    浏览(32)
  • 【Python查找算法】二分查找、线性查找、哈希查找

    目录 1 二分查找算法  2 线性查找算法 3 哈希查找算法         二分查找(Binary Search)是一种用于在有序数据集合中查找特定元素的高效算法。它的工作原理基于将数据集合分成两半,然后逐步缩小搜索范围,直到找到目标元素或确定目标元素不存在。 以下是二分查找的

    2024年02月08日
    浏览(38)
  • python求列表list平均值的方法

    python内置了两个函数,sum()和len()方法,其中sum()可以用于求取列表的元素和,len()函数可以用于求取列表list元素的个数,由此,利用python求列表list平均值的方法和步骤就脱颖而出了:第一步,使用sum()求元素和;第二步,使用len()求元素个数;第三步,分装为一个函数,方便

    2024年02月11日
    浏览(33)
  • 【算法系列 | 9】深入解析查找算法之—哈希表查找

    心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第9讲,讲一下查找算法的哈希表查找 查找算法是计算机科学中的一类

    2024年02月08日
    浏览(39)
  • Java 语言哈希查找算法实现

    哈希查找,也称为散列查找,是一种高效的查找算法。它利用哈希函数将映射到数组中的一个位置,通过直接访问该位置来获取元素,从而实现快速查找。Java语言提供了一些类和接口,例如 HashMap 和 HashTable ,使得我们可以方便地使用哈希查找算法。本文将详细介绍

    2024年02月10日
    浏览(33)
  • 数据结构,查找算法(二分,分块,哈希)

    一、查找算法         1、二分查找:(前提条件: 必须有序的序列) 2、分块查找:(块间有序,块内无序)     索引表  +  源数据表     思路:     (1)先在索引表中确定在哪一块中     (2)再遍历这一块进行查找 //索引表 typedef  struct  {     int max; //块中最大值

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包