数据结构——散列函数、散列表

2023-09-16 18:10:30


前言

  1. 散列表的基本概念
  2. 散列函数的构造方法
  3. 处理冲突的方法
  4. 散列查找及性能分析

提示:以下是本篇文章正文内容,下面案例可供参考

一、散列表的基本概念

  1. 概念:之前的算法建立在“比较”基础上,效率取决于比较次数
    散列函数:将关键字映射成该关键字对应地址的函数,记为Hash(key)=Addr,散列函数会把两个不同的关键字映射到同一地址,称为“冲突”,发生碰撞的不同关键字称为同义词;应尽量减少冲突,设计好的处理冲突的方法
  2. 哈希表:一个有限的连续的地址空间,用以容纳按哈希地址存储的记录。
  3. 哈希函数:记录的存储位置与它的关键字之间存在的一种对应关系。 Loc(ri)=H(keyi)。
  4. 同义词:在同一地址出现冲突的各关键字。
  5. 哈希(散列)地址:根据设定的哈希函数H(key)和处理冲突的方法确定的记录的存储位置。
  6. 装填因子:表中填入的记录数n和哈希表表长 m之比。
  7. α=n/m

二、散列函数的构造方法

  1. 函数定义域必须包括全部需要存储的关键字
  2. 散列函数计算出的地址能够等概率、均匀分布在整个地址空间,减少冲突
  3. 散列函数尽量简单,较短时间内能计算出任意关键字的地址
  1. 直接定址法:散列函数为 ;不会产生冲突,适合关键字分布基本连续的情况,若分布不连续,则空位较多,造成空间浪费
  2. 除留余数法:假定表长为m,取一个不大于m但最接近或等于m的质数p,散列函数为H(key)=key%p(需要选取好p)
  3. 开放定址法 (空缺编址法)
    Hi = ( H(key)+ di ) MOD m
    i=1,2, …, k (km-1)
    m:哈希表的表长; di:增量序列
    1)线性探测再散列 di= 1,2, …, m-1
    缺陷:有聚集(堆积)现象—非同义词地址冲突。
    2)二次探测再散列
    di= 12, -12, 22, -22, 32,…,k2 k  m/2
    缺陷:不易探查到整个散列空间。
    3)伪随机探测再散列 di = 伪随机数序列
    链地址法
    为每个哈希地址建立一个单链表,存储所有具有同义词的记录。
    冲突处理简单,无堆积现象,平均查找长度较短;
    较适合于事先无法确定表长的情况;
    可取α≥1,当结点信息规模较大时,节省空间
    删除结点的操作易于实现
    [设计哈希表的过程]
    1)明确哈希表的地址空间范围。即确定哈希函数的值域。
    2)选择合理的哈希函数。该函数要保证所有可能的记录的哈希地址均在指定的值域内,并使冲突的可能性尽量小。
    3)设定处理冲突的方法。

三、处理冲突的方法

为产生冲突的关键字寻找下一个“空”的Hash地址,用Hi表示冲突后第i次探索的散列地址

1. 开放定址法:

在这里插入图片描述
,m表示表长,di表示增量
(1)线性探索法:di=1开始,每次递增1,向后查找空位,直到找到一个空位或查遍全表;缺点:可能使第i个散列地址同义词存在第i+1个,造成大量相邻的散列地址聚集,大大降低了查找效率
(2)平方探测法:在这里插入图片描述
,k<=m/2 ,m=4k+3,又称二次探测法;可以避免堆积问题,缺点是不能探测到表的全部单元,但至少可以探测到一半
(3)再散列法:使用两个散列函数进行散列
注意:不能随便删除表中元素,因为若删除元素将会截断其他具有相同散列地址的元素的查找地址,所以要想删除一个元素,给它做一个标记,进行逻辑删除,但副作用是表面上看起来散列表很满,实际上有许多位置没有利用

2. 拉链法

(1)为避免非同义词发生冲突,可以把所有同义词存储在一个线性链表中,这个线性链表由散列地址唯一标识,拉链法适用于经常进行插入和删除的情况
在这里插入图片描述

四、散列查找及性能分析

1.散列查找
(1)初始化:根据散列函数计算出散列地址,addr=Hash(key)
(2)检测表中addr位置上是否有记录,没有记录则失败;若有记录比较它与key值,若相等返回成功标志,不然执行下面(3)
(3)用给定的处理冲突的方法计算“下一散列地址”,并把addr置为此地址,转入(2)
在这里插入图片描述

2.散列查找效率:取决于散列函数、处理冲突方法和装填因子
3.装填因子:在这里插入图片描述
平均查找长度依赖于装填因子; 越大,装填记录越满,冲突可能性越大,散列表查找成功与 有关,与表长无关
例题:
例1:已知一组关键字为(26,36,41,38,44,15,68,12,06,51,25),用线性探查法解决冲突构造这组关键字的哈希表。表长取15,哈希函数H(key)=key MOD 13。并求出等概率情况下查找成功的平均查找长度ASL.
在这里插入图片描述
例2:已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79),哈希函数为:H(key)=key MOD 13, 哈希表长为m=16,设每个记录的查找概率相等
在这里插入图片描述


总结

  1. 散列表的基本概念
  2. 散列函数的构造方法
  3. 处理冲突的方法
  4. 散列查找及性能分析
更多推荐

基于ASCON的AEAD

1.引言前序博客:ASCON:以“慢而稳”赢得NIST轻量级加密算法标准密码学中的AEAD(authenticatedencryptionwithassociateddata)对称密钥加密过去数年来已发生改变,具体为:当今主要使用streamciphers,因其比blockciphers要快得多。经常会使用AEAD(A

Python | 为FastAPI后端服务添加API Key认证(分别基于路径传参和header两种方式且swagger文档友好支持)

文章目录01前言02路径传参方式添加APIKey2.1完整代码2.2请求示例2.3swagger文档测试03请求头Header方式传入APIKey(推荐)3.1完整代码3.2请求示例3.3swagger文档测试01前言FastAPI,如其名所示,是一个极为高效的框架,特别适用于构建API后端服务。而在与其他网站的API

软件测试目的和原则

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试)一、软件测试的目的1)软件测试是为了发现错误而执行程序的过程。2)测试是为了证明程序有错,而不是证明程序无错。(发现错误不是唯一目的)3)一个好的测试用例在于它发现至今未发现的错误。4)一个成功的测试是

【递归】回溯算法、八皇后问题

一:递归的介绍1.1概念递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。1.2调用机制1.2.1打印问题publicstaticvoidtest(intn){if(n>2){test(n-1);}System.out.println("n="+n);}1.2.

商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1.涉及平台平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务)2.核心架构SpringCloud、SpringBoot、Mybatis、Redis3.前端框架VUE、Uniapp、Bootstrap/H5/CSS3、IOS、Android、小程

Web自动化测试详解(含文档+视频讲解)

Web自动化测试是软件测试中非常重要的一种测试方法,它通过编写脚本来模拟人工操作网页,从而实现对Web应用程序进行自动化测试的过程。为了保证测试质量和效率,我们需要遵循一定的流程和步骤来完成Web自动化测试。一、测试环境准备在进行Web自动化测试之前,我们需要准备好测试环境,包括测试工具、测试数据、测试服务器等。对于测

windwos10系统搭建我的世界服务器,内网穿透实现联机游戏Minecraft

文章目录1.Java环境搭建2.安装我的世界Minecraft服务3.启动我的世界服务4.局域网测试连接我的世界服务器5.安装cpolar内网穿透6.创建隧道映射内网端口7.测试公网远程联机8.配置固定TCP端口地址8.1保留一个固定tcp地址8.2配置固定tcp地址9.使用固定公网地址远程联机今天和大家分享一下只需简

使用SSE(Server-Sent Events)实现服务端给客户端发消息

首先是客户端,看着比较简单。但实际应用中可能要比这复杂,因为默认sse只支持get请求,而且没法携带header。所以如果默认的方法达不到需求的话可能需要额外实现,当然也可以引用第三方库,比如@rangermauve/fetch-event-source。所以有谁会自己实现呢?if(typeof(EventSource

云端渲染对比本地渲染,哪个性价比更好呢?

当前环境来看,三维渲染的模式被分为云端渲染对比本地渲染两种模式。云渲染是什么?云渲染就是一种基于云计算的3D图形渲染解决方案,将3D程序放在远程的服务器中渲染。其用户终端通过Web软件或者直接在本地的3D程序中点击一个“云渲染”按钮并借助高速互联网接入访问资源,指令从用户终端中发出,服务器根据指令执行对应的渲染任务,而

Kakfa - Producer机制原理与调优

Producer是Kakfa模型中生产者组件,也就是Kafka架构中数据的生产来源,虽然其整体是比较简单的组件,但依然有很多细节需要细品一番。比如Kafka的Producer实现原理是什么,怎么发送的消息?IO通讯模型是什么?在实际工作中,怎么调优来实现高效性?简单的生产者程序:一、客户端初始化KafkaProduce

selenium自动化测试-获取动态页面小说

有的网站页面是动态加载的资源,使用bs4库只能获取静态页面内容,无法获取动态页面内容,通过selenium自动化测试工具可以获取动态页面内容。参考之前的"bs4库爬取小说工具"文章代码,稍微修改下,就可以转成获取动态页面小说工具。第一步:先确定目标网址先找到小说目录页面。网址首页:'https://www.bq0.ne

热文推荐