「数据结构」哈希表1:基本概念

🎇个人主页:Ice_Sugar_7
🎇所属专栏:Java数据结构
🎇欢迎点赞收藏加关注哦!

基本概念

  • 🍉哈希表
  • 🍉哈希冲突
    • 🍌负载因子调节
    • 🍌解决哈希冲突
      • 🥝1. 闭散列法
      • 🥝2. 开散列法(哈希桶)

🍉哈希表

哈希表是一种数据结构,它使用哈希函数将键映射到数组中的一个位置(即将元素的存储位置和它的key之间建立映射关系)

  • 在存储一个键值对时,哈希函数根据key计算出一个索引(哈希地址),然后将键值对存储在对应的索引位置上

举个例子:

数据集合{1,7,6,4,5,9}
哈希函数设置为:hash(key) = key % capacity(capacity为存储元素底层空间的大小)

那我们可以推出每个元素存储的位置为
在这里插入图片描述

  • 在搜索元素时,对元素的key进行同样的计算,把求得的函数值当做元素的存储位置,在哈希表中取这个位置的元素进行比较,若key相等,则搜索成功

因为通过哈希函数计算得到的索引可以直接指向元素所在的位置,所以在理想情况下,查找、插入和删除操作的时间复杂度可以达到O(1)


🍉哈希冲突

不同的关键字通过相同的哈希函数计算出相同的哈希地址,该种现象称为哈希冲突

造成哈希冲突的原因之一是:哈希函数设计不够合理
我们在设计哈希函数时,应遵循:

  1. 哈希函数的定义域需要包括所有待存储的关键码
  2. 计算出来的哈希地址能均匀分布在整个空间中
  3. 哈希函数应该比较简单

🍌负载因子调节

哈希表载荷因子定义为 α = 填入表中的元素个数 / 哈希表长度
α越大,表明填入表中的元素越多,发生冲突的可能性越大
当α超过一定阈值时,会触发哈希表的扩容操作

在Java中,HashMap默认负载因子是0.75,0.75是一个被认为在时间和空间效率上做了平衡的经验值,它既保证了空间的有效利用,又尽量减少了冲突的发生,是一个相对较优的选择。

负载因子和冲突率的关系粗略演示:
在这里插入图片描述

我们可以通过降低负载因子来降低冲突率,因为哈希表中已有的关键字个数是不可变的,那么我们能调整的就只有哈希表中的数组的大小
注意:哈希表扩容后,需要重新计算里面的关键字的哈希地址

🍌解决哈希冲突

解决哈希冲突两种常见的方法是:闭散列开散列

🥝1. 闭散列法

也叫开放定址法,发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置的“下一个”空位置中
那怎么找空位置呢?

  • 线性探测
    从发生冲突的位置开始,依次向后探测,直到寻找到下一个空位置为止
    比如对于刚才上面的例子:
    在这里插入图片描述
    如果要插入44,那它会和4产生冲突,采用线性探测解决冲突的话,那就会插入到下标为8这个空位置在这里插入图片描述

线性探测的缺陷是产生冲突的数据堆积在一块,这与其找下一个空位置有关系,因为找空位置的方式就是挨着往后逐个去找。如果表中只填入4,而接下来要填入44,14,24,34一系列数字的话:
在这里插入图片描述
采用二次探测可以避免这个问题

  • 二次探测
    二次探测通过下面的公式算出要插入哪个空位置
    在这里插入图片描述

比如对于上面的例子,使用二次探测解决冲突后得到:
在这里插入图片描述

🥝2. 开散列法(哈希桶)

又叫链地址法、开链法
先用哈希函数算出每个关键码的哈希地址,具有相同地址的关键码归于同一子集合,每个子集合称为一个,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中
在这里插入图片描述
从这个图可以看出:开散列中每个桶放的都是发生哈希冲突的元素

  • 在一些哈希表的实现中,当哈希桶中的链表长度超过一定阈值时,可能会将链表转换为红黑树。因为当链表长度较长时,查找、插入和删除操作的时间复杂度会变得较高,而红黑树的时间复杂度相对较低,将链表转换为红黑树可以提高哈希表的性能
  • 在JDK 8中的HashMap实现中,当链表长度超过8个元素时,会将链表转换为红黑树

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

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

相关文章

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-中断管理

目录 一、中断基础概念二、中断管理使用说明三、中断管理模块接口四、代码分析(待续...) 一、中断基础概念 在程序运行过程中,出现需要由 CPU 立即处理的事务时,CPU 暂时中止当前程序的执行转而处理这个事务,这个过程…

【ES】--Elasticsearch的分词器详解

目录 一、前言二、分词器原理1、常用分词器2、ik分词器模式3、指定索引的某个字段进行分词测试3.1、采用ts_match_analyzer进行分词3.2、采用standard_analyzer进行分词三、如何调整分词器1、已存在的索引调整分词器2、特别的词语不能被拆开一、前言 最近项目需求,针对客户提…

机器学习9-随机森林

随机森林(Random Forest)是一种集成学习方法,用于改善单一决策树的性能,通过在数据集上构建多个决策树并组合它们的预测结果。它属于一种被称为“集成学习”或“集成学习器”的机器学习范畴。 以下是随机森林的主要特点和原理&…

一个下载底图的网站(支持Google、必应、esri、天地图、星图地球、maptile等)

简介 hello,我是锐多宝,今天介绍一个免费的、无需登录、可自定义的底图数据下载网站。 网址为:https://layerdownload.ruiduobao.com/。相关信息可以看下面的视频: 多种遥感底图下载方法(Google遥感底图、必应遥感底…

【电路笔记】-串联电感

串联电感 文章目录 串联电感1、概述2、电感串联示例13、互耦串联电感器4、电感串联示例25、电感串联示例36、总结 当电感器以菊花链方式连接在一起并共享公共电流时,它们可以串联连接在一起。 1、概述 这些电感器的互连产生了更复杂的网络,其总电感是各…

C++联合体详解!

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家伙新年快乐,今天我们来了解一下C联合体。 文章目录 1.联合体 1.1联合体的概念 1.2联合体的思想 1.3联合体的作用 1.3.1内存优化 1.3.2二进制数据操作 1.3.3类型转换 1.3.4解决特定问…

黄金交易策略(Nerve Nnife.mql4):趋势做单

完整EA:Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 当大小趋势相同行情走向也相同,就会开仓做顺势单,并会顺势追单,以达到快速止盈平仓的效果。大趋势追求稳定,小趋势追求敏捷,行情走向比小趋势更敏…

【Java程序设计】【C00260】基于Springboot的企业客户信息反馈平台(有论文)

基于Springboot的企业客户信息反馈平台(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的企业客户信息反馈平台 本系统分为平台功能模块、管理员功能模块以及客户功能模块。 平台功能模块:在平台首页可…

【北邮鲁鹏老师计算机视觉课程笔记】06 corner 局部特征

【北邮鲁鹏老师计算机视觉课程笔记】06 corner 局部特征 1 局部特征的任务牵引:全景拼接 ①提取特征 ②匹配特征 ③拼接图像 我们希望特征有什么特性? ①可重复性 ②显著性 ③计算效率和表达紧凑性 ④局部性 2 特征点检测的任务 3 角点 在角点&#…

论文阅读:《Deep Learning-Based Human Pose Estimation: A Survey》——Part 1:2D HPE

目录 人体姿态识别概述 论文框架 HPE分类 人体建模模型 二维单人姿态估计 回归方法 目前发展 优化 基于热图的方法 基于CNN的几个网络 利用身体结构信息提供构建HPE网络 视频序列中的人体姿态估计 2D多人姿态识别 方法 自上而下 自下而上 2D HPE 总结 数据集…

npm ERR! network This is a problem related to network connectivity.

遇到 ETIMEDOUT 错误时,这表明npm尝试连接到npm仓库时超时了,这通常是由网络连接问题引起的。这可能是因为网络不稳定、连接速度慢、或者你的网络配置阻止了对npm仓库的访问。以下是一些解决这个问题的步骤: 1. 检查网络连接 首先&#xff…

Solidworks:从2D走向3D

Sokidworks 的强大之处在于三维实体建模,这个形状看似复杂,实际上只需要拉伸一次,再做一次减法拉伸就行了。第一次做三维模型,费了不少时间才搞明白。 接下来做一个稍微复杂一点的模型,和上面这个操作差不多&#xff0…

华为配置双链路热备份场景下的无线配置同步示例

配置双链路热备份场景下的无线配置同步示例 组网图形 图1 配置双链路热备份示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 某企业为保证业务的正常运营,希望提高网络可靠性,同时还希望减少配置维护的工作量。为满…

团队配置管理规范浅见

在一段时间的工作过程中配置管理工作确实对我们的生产活动产生了巨大的工作量,现在就这个工作来进行梳理一下。 本文主要分为两部分: 1、借用软件系统分析师的配置管理部分内容来介绍配置管理的工作(原谅时间精力有限,原文基本已…

单例模式:懒汉饿汉线程安全问题

在我们前几篇文章中都了解了一些关于线程的知识,那么在多线程的情况下如何创建单例模式,其中的线程安全问题如何解决? 目录 1.什么是单例模式? (饿汉模式) 2.单例模式(懒汉模式) *懒汉模式与懒汉模式的对比 *如何解决懒汉模式…

蓝桥杯嵌入式第9届真题(完成) STM32G431

蓝桥杯嵌入式第9届真题(完成) STM32G431 题目 分析和代码 main.h /* USER CODE BEGIN Header */ /********************************************************************************* file : main.h* brief : Header for main.c file.* …

【开源】SpringBoot框架开发数字化社区网格管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5.1 查询企事业单位5.2 查询流动人口5.3 查询精准扶贫5.4 查询案件5.5 查询人口 六、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数字化社区网格管理系统&#xf…

Prometheus服务器、Prometheus被监控端、Grafana、监控MySQL数据库、自动发现概述、配置自动发现、Alertmanager

目录 Prometheus概述 部署Prometheus服务器 环境说明: 配置时间 安装Prometheus服务器 添加被监控端 部署通用的监控exporter Grafana 概述 部署Grafana 展示node1的监控信息 监控MySQL数据库 配置MySQL 配置mysql exporter 配置mysql exporter 配置…

InternLM大模型实战-6.OpenCompass大模型评测

文章目录 前言笔记正文关于模型评测的三个问题为什么需要评测我们需要测什么怎么测试大语言模型 主流大模型评测框架OpenCompass大模型评测领域的挑战 前言 本文是对于InternLM全链路开源体系系列课程的学习笔记。【OpenCompass 大模型评测】 https://www.bilibili.com/video/…