数据结构——哈希表的平均查找长度

ops/2024/9/25 10:32:09/

我们要首先知道哈希表是干什么的,哈希表并不是为了单纯存储数据的,他并不会减小存储这些数据使用的空间,而是为了实现快速的数据查找,插入和删除操作map就可以使用哈希表来实现,所以map可以实现利用键来快速访问到值。

哈希表是一种数据结构,它通过使用哈希函数将关键字映射到内存中的特定位置(通常是数组的索引),从而将关键字和其存储的地址之间建立了联系。这样一来,当需要查找特定关键字时,可以通过哈希函数计算出其在哈希表中的位置,并直接访问该位置的存储单元,从而实现快速的查找操作。

哈希函数在构造哈希表的时候就是运用关键字来构造的,这样才能决定我们访问哈西表中的关键字十分迅速,对于普通数组只是将各种关键字仅仅存储了进去,没有根据关键字来存储,所以这样访问关键字的位置就很慢。顺便说一下这里的关键字就是数据库中的关键字,是主键,能唯一标识一条数据,所以这个属性中的值不能重复,有点扯远了。

下面着重来讲解的是,使用哈希冲突解决方法:线性探测再散列二次探测再散列,来构建哈希表之后,如何求查找成功查找失败的平均查找长度。

哈希表元素个数: n

哈希表长度 :m

除留余数法中:p(p≤m)
构造方法:除留余数法(常用)

哈希表的查找过程其实与构造过程相同 

 当我们在哈希表中查找时,查找过程的顺序必须与构造哈希表时采用的哈希冲突处理方式的顺序相同。这是因为哈希表的查找依赖于哈希函数和哈希冲突处理方式。如果查找过程不遵循构造哈希表时采用的哈希冲突处理方式的顺序,就可能无法正确查找数据,导致查找结果错误或异常。正确的顺序确保查找与插入/删除过程保持一致,从而保证哈希表的完整性和一致性。

下面这个例子使用的哈希冲突解决方法为:开放寻址法中的线性探测再散列

关键字集合{45,18,33,5,78,66,21,19,11,32}

m=13   n=10   p=11   哈希函数 H(key)=key mod 11

地址0123456789101112
关键字3345786611518192132

这个哈希表我们已经构造完成了

  • 求成功的ASL是针对于每个数字的,即你要把所有数字的查找后的次数做个累加,最后除的数字是元素的个数!这个很好理解,因为我们研究的也是所有元素的查找次数。
  • 主要介绍求失败的ASL

 对于一个元素如14
查找流程 14%11=3    H1 = ( 3 + 1 ) mod 13 = 4    H2 = 5   H3 = 6  
在下标6位置发现元素为空,说明查找不成功。为什么?

前面说了查找过程与创建哈希表过程一样。创建时若这个为空,肯会将14填入位置6,现在查找时发现为空只能说明当初创建时没有14这个元素,故14不在哈希表中,查找失败。

这样我们便不难理解,对于查找一个元素e时,会看先看e%P,便对应等可能性定位到P个地址上,我们便数这个位置距离最近的空位有多远(这里是以线性探测再散列为例)
我们查找失败时,对于一个元素初始%P等可能定位至P个位置,分母故为P,分子为每个位置到最近空的位置比较的次数和。
这里的ASL=(7+6+5+4+3+2+1+3+2+1+3)/11 = 37/11

求不成功的ASL针对的是每个位置!即每个位置往后找第一个为空的位置所比较的次数,然后累加最后除以哈希表的规模(如果是除留余数法,这个规模就是那个模数),使用除留余数法构造的位置的个数为p。

使用二次探测再散列解决哈希冲突,我们求平均查找长度

查找过程的顺序必须与构造哈希表时采用的哈希冲突处理方式的顺序相同

所以这里查找的时候要按照增量序列:di:1^2,-1^2,2^2,-2^2,3^2,-3^2 ……

即1,-1,4,-4,9,-9……来查找,当然生成哈希表的时候解决冲突也是按照这个序列来解决的,因为哈希表的查找过程其实与构造过程相同

例子就以图片形式了,这里我能保证哈希表构造是正确的,但是这两个平均查找长度我就不确定了,很可能是错误的,所以,欢迎大家指正!!! 


http://www.ppmy.cn/ops/32360.html

相关文章

Unity 性能优化之Profiler窗口(二)怎么看懂这个分析器

提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 前言一、Profiler打开方式二、Profile简介添加没有的模块1.点击Profiler Modules(分析器模块)2.勾选GPU即可 自定义模块1.点击Profile…

windows内核开发:如何使用反汇编引擎

前言 最近在写个人项目中需要在内核模式下使用到反汇编引擎,找到几个并使用对比后我强烈推荐一款名叫BeaEngine的反汇编引擎。这是它的项目仓库链接:https://github.com/BeaEngine/beaengine 编译 项目下载下来后需要使用CMake编译,在此之前…

数据结构学习/复习6---双向链表的实现/随机指针链表练习/顺序表与链表对比/存储体系简述

一、链表的结构*8 二、带头双向循环链表的实现 注意事项1:是否需要断言于实际情况中传来的指针是否可以为空,不可以则要断言 三、链表、指针、拷贝经典练习题 四、顺序表与链表总结对比

【redis】Redis数据类型(四)Set类型

目录 Set类型介绍使用场景 Set类型数据结构set的单个元素的添加过程IntSet哈希表内存结构 常用命令SADD示例 SREM示例 SMEMBERS示例 SISMEMBER示例 SCARD示例 SMOVE示例 SPOP示例 SRANDMEMBER示例 SINTER示例 SINTERSTORE示例 SUNION示例 SUNIONSTORE示例 SDIFF示例 SDIFFSTORE…

MySQL 和 Hive 存储引擎对表数量、索引有那些限制?

目录 MySQL 存储引擎限制 Hive 存储引擎限制 MySQL 存储引擎限制 MySQL支持多种存储引擎,如InnoDB和MyISAM,每种引擎都有自己的特性和限制。 最大表数: InnoDB存储引擎没有硬性限制表的数量,它通常受限于操作系统文件数的限制。MyISAM存储引…

公开课—京东生产环境海量数据架构优化实战

文章目录 读多写少——主库用来写,从库用来读单库的写压力太大——数据库的垂直和水平拆分分表怎么分呢?hash分表range分表多数据源操作与分布式事务问题 ShardingSphare分库分表(京东开源)关联查询怎么办?跨多个库&am…

机器学习笔记-22

终章 至此吴恩达老师的机器学习课程已经完成啦,总结一下: 1.监督学习的算法:线性回归、逻辑回归、神经网络和向量机 2.无监督学习的算法:K-Means、PCA、异常检测 3.推荐系统、大规模数据处理、正则化、如何评估算法 4.上限分析、…

鸿蒙OpenHarmony【轻量系统 烧录】 (基于Hi3861开发板)

烧录 针对Hi3861开发板,除了DevEco Device Tool(操作方法请参考烧录)外,还可以使用Hiburn进行烧录。 前提条件 开发板相关源码已编译完成,已形成烧录文件。客户端(操作平台,例如Windows系统&…