算法与数据结构 --- 查找 --- 散列表的查找

news/2024/7/30 21:20:28/文章来源:https://blog.csdn.net/qq_51947882/article/details/127058322

第一部分 --- 散列表的基本概念

1.在记录表中的记录(元素)的存储位置和记录的关键字之间存在着对应关系,这个对应关系就是hash函数

 

1.通过哈希函数找查找表中的某个元素的存储位置就非常方便了,我们只需要将这个元素的关键字作为参数传给哈希函数,哈希函数在成功将关键字根据对应关系转换为存储位置后,就会转换得到的存储位置(下标),如果转换失败的话一般会返回空指针或者是0

1.能够使用哈希函数查找元素的查找表叫做散列表,往散列表中存储元素的时候,也是通过关键字 + 哈希函数转换得到存储位置(下标)然后进行存储,这种存储方式导致的结果就是查找表的空间利用效率低,但是查找速度块,时间复杂度为O(1) --- 只用执行一次哈希函数即可

1.散列方法就是使用哈希函数来存储元素和查找元素的方法

2.散列函数就是哈希函数,本质上是一个转换器,通过给定的对应关系将关键字转换为散列表中的对应的存储位置

1.通过散列方法存储元素时创建的表就是散列表

1.什么叫冲突:冲突指就是散列表中的一个存储位置有多个元素想要存储(散列表中一个位置只能存一个元素,先到先得)

2.什么是同义词,同义词描述的是多个关键字之间的关系,假设有k个不同关键字,将这k个不同的关键字作为参数传给哈希函数都得到了相同的存储位置的话,则称这k个不同的关键字互为同义词

2.散列表又称为哈希表


第二部分 --- 散列(哈希)函数的构造方法

首先,通过哈希函数来将关键字转换为存储位置时,冲突是不可避免的,我们只能够尽可能的减少冲突,那么怎样才能够有效的减少哈希函数带来的冲突造成的问题?

方法一:构造一个好的哈希函数,这个哈希函数(散列函数(转换器))要足够足够高效,简单,稳定,转换速度快,并且通过这个转换器转换出的存储位置要尽可能的均匀分布,如果过密分布可能导致冲突出现,如果过疏分布则可能导致空间浪费

方法二:当冲突不可避免的出现的时候我们要有好的解决冲突的方案,这个方案也需要尽可能的简单,高效和稳定。

(一个是解决问题本身,一个是解决问题)

 

1.有多少个数据就占多少个地址

1.直接定址法采用的是线性函数,线性函数的自变量和因变量一一对应,所以不用考虑冲突的问题

1.质数是只有1和它本身能够整除它的非负整数称为质数

2.上面这个m是关键字序列的长度,这个 p 是尽可能取较大值的质数


第三部分 --- 处理冲突的方法

这里主要介绍两种方法:开放地址法和链地址法

1.开放地址法其实就是在出现冲突的时候,那么我们就在表中找一个新的存储位置来存储元素,如果这个存储位置对应的元素还不为空的话,那就继续存到新的存储位置,直到找到元素为空的存储位置为止(如果找编所有的存储位置都不行的话,那就返回表已满)

2.那么我们获得新的存储位置的方法是什么呢?

我们常常采用除留余数法来获得新的存储位置,使用这个方法的具体步骤是:

一.将通过哈希函数求得的元素不为空的存储位置(下标)作为参数传给这个函数,函数处理完之后就会返回新的存储位置(下标)

(函数的处理方法是将传过来的参数加上一个增量序列,然后将求得的和除以m(m为散列表的长度)并取余,最终的计算结果就是我们要返回的新的存储位置(下标))

二.如果新的存储位置(下标)对应的元素依然不为空的话,我们就通过更改方法中的增量序列(其它值不变)的方式再次获得新的存储位置,如果元素还是不为空,那就继续重复第二步,直到新的存储位置超出了散列表的范围为止

3.根据增量序列的不同,除数取余法又分为三种类型,分别是:

线性探测法,二次探测法,伪随机探测法 

线探:第一次求新存储为止时增量序列为1,第二次是2,第三次是3.....一直到第m - 1次为止

 

查找的时候也同理,如果查找的值的关键字和计算出的存储位置的元素的关键字不同的话,我们就用整数取余法去看其它的存储位置元素,如果还是不相等的话那就继续获取新存储位置来查找,直到找到或者是存储位置超出散列表范围为止

(查找时获得新地址的方法和我们上面插入元素时获得新地址的方法一样)

二次探测法:增量序列第一次探测是1的平方,第二次是 - (1的平方的),第三次是2的平方,第四次则是 - (2的平方)....一直到q的平方为止

伪随机探测法:每一次探测时,增量序列都是我们给的一个伪随机数

1.整数取余法是用来获得新地址的(里面的m等于散列表的长度),除留余数法是用来构造散列函数的,里面的p是最接近关键字序列长度的质数(只能够被1和它本身整除的非负整数)

1.非负整数K mod 非负整数m (即将整数K除以非负整数m后取余)的计算结果的范围是 0到 m -1 

 

1.用开放地址法的时候,可能会出现非同义词之间存在冲突。原因如下:

首先是多个同义词之间存在冲突,则我们要找新的且为空的 存储位置来存放没被存放的同义词,在存放好后有一个和同义词不同的的关键字通过散列函数刚好找到这个新的存储位置,此时非同义词之间就会发生冲突(散列表中同一个位置要被多个元素争着存放)

链地址法的缺点也很明显,就是空间浪费严重


第四部分 --- 散列表的查找

 

 (ASL是每个元素的平均查找长度)

查找散列表中的每一个非空元素所需要的次数就是对应位置下面的红色数字

1.用链地址法处理冲突时,平均比较次数能够少的原因是:链地址法采用了空间换时间的模式

1.表中填入的记录数就等于表中填入的元素数

2.填入的记录数越大,越容易发生冲突,一旦发生冲突就需要解决冲突,而要解决冲突的话必然会涉及到多次比较,查找时的平均比较次数就会增大

 

1.链地址法除了空间消耗比较多外,它的查找速度快,且是动态的,方便插入和删除元素(记录)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_14664.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFMPEG教程(一) FFmpeg常用基本命令行

来源:微信公众号「编程学习基地」 文章目录 官方发布版本下载FFMPEG一、获取视频信息二、分离视频音频流三、视频编码格式转换四、视频转码五、过滤器的使用视频添加logo视频添加遮盖和文字添加遮盖添加文字六、视频剪辑七、修改分辨率重要常用参数说明:ffplay指定解码方式播…

一个注解搞定责任链,学还是不学?

背景 在繁琐的业务流程处理中,通常采用面向过程的设计方法将流程拆分成N个步骤,每个步骤执行独立的逻辑。 public void process(params){doFirst(params);doSecond(params);....doLast(params); }但是这样剥离仍然是不彻底的,修改其中一个步…

pcb - 家用桌面型回流焊机不能买功率太大的

文章目录概述END概述 今天来总结一下经验教训. 以前公司用的正邦桌面型回流焊机用起来很不错. 具体型号没看. 最近, 想在家里用桌面型回流焊机焊板子. 比较了一下抽屉尺寸, 确定以前公司用的就是ZB5040HL. 既然以前同事用的那么好用, 就买了和以前公司一样的回流焊机 ZB5040HL…

同样是测试工程师,月薪8k的功能测试和月薪14k的自动化测试,差在了那里?

关于软件测试这几年是越来越红火,待遇对于其他行业也是非常的高,万八千的待遇很正常,而现在软件测试行业等级越来越专业化,对软件测试工程师的要求也是越来越高,软件测试工程师一般会分为初级软件测试工程师&#xff0…

外汇天眼:MetaQuotes 最新回应:“与西方对俄罗斯的制裁没有联系”

近日,外汇投资者都知道MT4和MT5被苹果全球下架的事,昨天天眼君已经做过报道,现在事情有了进一步进展。 与西方对俄罗斯的制裁没有联系? MetaQuotes官网回应:“与西方对俄罗斯的制裁没有联系”。 据知名行业媒体《Fin…

儿童睡衣CE认证,燃烧测试标准EN 14878如何办理?

儿童睡衣CE认证,燃烧测试标准EN 14878如何办理? EN 14878:2007标准规定了在根据 EN 1103 进行测试但未经过洗涤程序时,儿童睡衣和用于此类服装的睡衣面料的燃烧性能要求。在没有根据《通用产品安全指令》第 4 条赋予特殊地位的其…

Dubbo的spi机制分析和实战案例

你好,我是田哥上一篇文章:在Dubbo中,模板方法模式 用的真6!留下来一个问题,想深入学习Dubbo源码,你需要具备哪些技术点。技术点Spring xml自定义标签 或 通过DubboComponentScan("con.tian.dubbo.serv…

Javascript V8引擎与Blob对象

JavaScript V8引擎 V8 是驱动 Google Chrome 的 JavaScript 引擎的名称。 V8 提供了 JavaScript 执行的运行时环境。 DOM 和其他 Web 平台 API 由浏览器提供。 V8的内存限制 在64位系统下约为1.4 GB,32位系统下约为0.7 GB。 V8为什么要限制堆的大小&#xff1f…

【Unbuntu】高可用kubernets集群部署

高可用k8s集群搭建 各主机角色分配及IP地址如下表所示: 主机名IP角色版本master110.196.96.11control-plane,masterv1.21.0master210.196.96.12control-plane,masterv1.21.0master310.196.96.17control-plane,masterv1.21.0 服务器配置: 1、禁用swap(所…

李飞飞:云原生数据库是大势所趋

云原生数据库不是弯道超车,是换道超车。 数据库、芯片、操作系统并列为全球信息技术三大件,也是企业技术系统必不可少的核心,互联网、金融、政务、电信、制造等主要行业都依赖于数据库技术和产品。在云数据库诞生之前,以Oracle为…

PCIe系列专题之四:4.0 物理层结构解析

一、故事前传 前面的文章针对PCIe的一部分内容已经做了解析。 较为详细解释请见之前的文章: 1. PCIe技术概述; 2.0~2.8 PCIe Transaction layer事务层详细解析; 3.0~3.2 PCIe数据链路层详细解析; 二、物理层结构 在PCIe体系中&a…

详细讲解库函数的使用及模拟实现(提升对库函数的理解和运用)

文章目录前言1.strlen2.strcpy3.strcat4.strcmp5.strstr5.atoi总结前言 学好库函数的使用,才能让我们从写出更优秀的代码。 今天要介绍的是strlen,strcpy,strcat,strcmp,strstr,atoi。 1.strlen 先来看看标准库中是如何定义的 从标准库中可以看出strlen返回值是s…

工程项目管理——第二、三章 项目初始

项目立项 立项流程 明确项目的目标,时间表,项目使用的资源和经费,而且得到执行该项目的项目经理和项目发起人的认可。 Make or Buy决策 项目招投标过程 甲方招标书定义乙方项目分析招标与竞标合同签署 项目章程 确定项目存在的文件&…

你知道什么是嵌入式技术吗?

目前嵌入式技术以及成为消费类产品的共同发展方向,这也使得很多人都想要了解嵌入式软件工程师到底是做什么的,对于嵌入式还是有很多疑问,下面就一起来看看什么是嵌入式技术吧。 嵌入式软件工程师是什么?点击获取1V1嵌入式学习规划…

线性杂双功能PEG试剂AC-PEG-Silane,Acrylate-PEG-Silane

一:描述 An English name:AC-PEG-Silane,Acrylate-PEG-Silane Chinese name:丙烯酸酯-聚乙二醇-硅烷 The category:Acrylate/Acrylamide PEG Silane PEG CAS:N/A Formula:N/A AC-PEG-Sila…

最关心的是期货开户手续费和保证金

​一、期货交易保证金 保证金的计算成交价格交易单位保证金比例 (交易单位和保证金比例在期货合约中都有说明,在交易软件中(F10)可以查看交易合约资料) 在期货合约中规定的保证金比例是交易所标准,保证金…

【RuoYi-Vue-Plus】扩展笔记 04 - CentOS 8 配置 Jenkins 自动发布

文章目录前言准备环境安装步骤1、Maven 安装2、Jenkins 安装3、Jenkins 配置3.1、配置 Maven3.2、配置 Git4、配置项目4.1、源码管理4.2、构建前言 一般来说,很多用【RuoYi-Vue-Plus】框架的朋友都是用 Docker 部署的,这篇笔记主要是写给那些直接运行 j…

GPDB vs CK - NYC taxi data 简单测试对比

今天开始,我想做一个 Greenplum 和 ClickHouse 的一系列简单测试对比,使用CK官网提供的数据集,主要目的有2个: 简单体验一下 CK 在单表测试上的性能比 GP 好多少;踩踩坑,积累一些二者对比测试经验。 特别说…

js - leetcode-爬楼梯

前言 有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来,由此可见,leetcode的题还是有分量的。今天我们就来会会它们 题目地址 爬楼梯 题目介绍 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有…

QT 语言的学习 day09 进程 和 线程

1.进程 (需要的资源多,所以不常用,) 进程的 QProcess QProcess 是一个进程类 成员函数: start(命令,参数); 启动进程执行可执行的程序 kill(); 结束进程 state(); 获取进程的状态 QProce…