【Java数据结构】---哈希表

ANSYS Maxwell:创建即用型 3D 轴向磁通电机模型 Magnet Length” 是磁体的径向长度。“Magnet Thickness” 是磁体的轴向长度。为了对 AFM 进行更详细的分析,用户需要在 ANSYS Maxwell 中运行 3D FEA 分析。对于 2D 模型,它们类似于 MotorCAD 中的模型,后者对等效的直线电机进行建模。单击“确定”后,将创建一个 3D Maxwell 模型。“长度”是转子铁的轴向长度。然后需要定义定子的“磁芯”尺寸和材料。“长度”是定子铁芯的轴向长度。“转子”# 的极数必须与“定子”中定义的磁极相同。 阅读详情

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言 ,Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

前言

在顺序结构以及平衡树中,元素对应的关键码与这个元素在电脑中存储的位置没有对应关系,因此,要查找一个元素,必须要经过该元素关键码的多次比较。面对较多的数据,搜索的效率就大大降低了。也就是说: 搜索的效率取决于搜索过程中元素的比较次数。

最理想的搜索方法就是,不经过任何比较,直接从表中得到要搜索的元素

哈希的概念

如果构造一种存储结构,通过某种函数,使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。

该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(Hash Table)(或者称散列表)

举个例子:

数据集合{1,7,6,4,5,9};

哈希函数设置为:hash(key)=key%capacity;(capacity为存储元素底层空间总大小 != 数组大小)

按照这个哈希函数求得的值,就是这个元素对应要放的下标。

在这里插入图片描述

哈希冲突

那么如果这组数据里面加了一个14,此时,要怎么放呢?

在这里插入图片描述

显然,此时有两个不同的关键字,使用同一个哈希函数,求得了一个相同的存储位置。此时就发生了哈希冲突

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

冲突 避免

既然有冲突,那就要防止冲突的发生。

但是实际上,由于我们哈希表底层数组的容量往往是小于实际要存储的关键字的数量的,这就导致一个问题,冲突的发生是必然的,但我们能做的应该是尽量的降低冲突率

设计合理的哈希函数(第一种方法避免)

设计原则:

  1. 哈希函数的定义域必须包括需要存储的全部关键码,而如果散列表允许有m个地址时,其值域必须在0到m-1之间

比如:前面底层数组长度为10,值域在0~9之间就不会冲突:一旦出现值域之外的值,像是14,就会出现冲突。

  1. 哈希函数计算出来的地址能均匀分布在整个空间中
  2. 哈希函数应该比较简单

常用的哈希函数

  1. 直接定制法:取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B 。适合查找比较小且连续的情况。

优点:简单、均匀
缺点:需要事先知道关键字的分布情况

  1. 除留余数法:设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数

哈希函数:Hash(key) = key% p(p<=m),将关键码转换成哈希地址

  1. 还有平方取中法、折叠法、数学分析法…………

注意:哈希函数设计的越精妙,产生哈希冲突的可能性就越低,但是无法避免哈希冲突(我们平时也不会去设计一个哈希函数,直接用原生的可以了)

调节负载因子(第二种方法避免)

负载因子a = 填入表中的元素个数 / 散列表的长度

在这里插入图片描述
得出结论:当负载因子越大,冲突率越大。

在这里插入图片描述
增加散列表长度,就只能去扩容,Java里面默认负载因子是0.75,也就是说,当负载因子是0.75时,进行扩容

冲突 解决

闭散列(第一种方法解决)

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

像上面出现的14和4冲突,那就可以把14放到4后边的空位置去

如何去找到下一个空位置?

线性探测

线性探测:从发生冲突的位置开始,依次向后探测,直到寻找到下一个空位置为止。

在这里插入图片描述
但是这种方法有一个缺点 ,那就是删除的时候,不好直接删除。

如果把4删去,那么搜索14时该怎么找呢?

解决办法肯定有,伪删除,删除的下标设置为bool类型,删除后为false。但是,这样一来就会很复杂。

二次探测

二次探测:线性探测的缺陷是产生冲突的数据堆积在一块,这与其找下一个空位置有关系,因为找空位置的方式就是挨着往后逐个去找,因此二次探测为了避免该问题, 找下一个空位置的方法为:H(i)=(H0+i^2)%m。H0是通过散列函数Hash(x)对元素的关键码 key 进行计算得到的位置,m是表的大小

在这里插入图片描述
闭散列最大的缺陷就是空间利用率比较低,这也是哈希的缺陷。 为解决这个问题出现了开散列。

开散列(哈希桶)(第二种方法解决)

                        数组+链表的形式

开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合(也叫做桶),各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。
在这里插入图片描述

通常,哈希表的插入、删除、查找时的时间复杂度为O(1)

与Java类集的关系

  1. HashMap 和 HashSet 即 java 中利用哈希表实现的 Map 和 Set
  2. java 中计算哈希值实际上是调用的类的 hashCode 方法,进行 key 的相等性比较是调用 key 的 equals 方法。所以如果要用自定义类作为 HashMap 的 key 或者 HashSet 的值,必须覆写 hashCode 和 equals 方法,而且要做到 equals 相等的对象,hashCode 一定是一致的

使用HashMap,HashSet

pubilc static void main(String[] args){
     HashMap<String,Integer> map=new HashMap<>();
     map.put("axc",3);
     map.put("hello",13);
     map.put("oca",3);
     
     //Key不能重复,天然去重
     HashSet<String> set=new HashSet<>();
     set.put("axc");
     set.put("hello");
     set.put("oca");  
}

与TreeMap、TreeSet一样,HashSet底层也是一个HashMap,而且方法的使用与TreeMap、TreeSet也一样。

HashMap,HashSet不涉及比较,因为他们底层都是数组+链表,不是搜索树

完结

好了,到这里【Java数据结构】部分就已经结束了~
如果这个系列博客对你有帮助的话,可以点一个免费的赞并收藏起来哟~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散~~Java

LabVIEW进行MQTT通信及数据解析 该文章介绍了LabVIEW的MQTT通信的开源VI控制,以及如果进行数据的解析,特别是一些需要注意的点 阅读详情

相关推荐

保姆级教程:用Python 3.10和Ollama在Windows上搞定LightRAG本地部署(附环境配置避坑指南)

本文提供了一份详细的Windows系统下LightRAG本地部署指南,涵盖Python 3.10环境配置、Ollama模型服务安装到LightRAG核心组件部署的全流程。特别针对Windows平台常见问题提供解决方案,帮助开发者快速搭建高效的检索增强生成(RAG)系统,实现专业领域知识的智能检索与整合。

weixin_28725407的博客 482

数据结构—散列表(哈希表)的原理以及Java代码的实现

本文详细介绍了散列表的概念、散列函数的选择、散列冲突的解决办法,并且最后提供了一种散列表的Java代码实现。

终生学习践行者 5103

IPSec Over GRE和GRE Over IPSec技术

IPSec Over GRE 和 GRE Over IPSec 一. 技术介绍 IPsec     主要作用是对数据进行加密,因为他能提供所有有时候被单独用作实现加密的一种方法!IPsec建立的是一个逻辑隧道,并不是真正意义上的隧道!并且不能提供路由功能,因为IPsec不支持非ip流量,也不支持广播(组播)! GRE     (通用路由封装)能很好的提供一个真正意义上的点对点的隧道,GRE是一种三层VPN封装技术。GRE可以对某些网络层协议(如IPX、Apple Talk、IP等)的报文进行封装,使封装后

qq_56228347的博客 9870

Java数据结构-哈希表(散列表)

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(H...

BLOG OF PETERMAOSX. 433

Ubuntu无桥接模式或连不上网(详细解决方法

目录 问题1:Ubuntu没有未桥接的主机网络适配器 解决方法 1.打开VMware安装目录下的文件 ​编辑2.右键安装以上三个文件 3.打开网络状态属性,找到VMware bridgeProtocol,点击安装 问题2.Ubuntu桥接模式连不上网 1.win+r打开cmd终端,输入ipconfig /all 2.记录以下数据 3.打开VMware网络设置 问题1:Ubuntu没有未桥接的主机网络适配器 VMWare安装之后,虚拟网络一直使用默认配置 VMnet0为...

m0_65592409的博客 6062

离线AI实战指南:本地部署大模型处理PDF/Word/Excel

离线AI是指在无网络、不上传数据前提下,于个人设备运行大语言模型并完成文档理解、多轮对话与代码辅助等任务的技术方案。其核心依赖本地模型推理、文档解析向量化和轻量级对话调度三大能力。随着Phi-3、Qwen2、Llama3等轻量化开源模型普及,以及Ollama、LM Studio等易用工具成熟,普通用户已可在主流笔记本上实现PDF摘要、合同比对、代码注释等真实办公场景。本文聚焦离线AI的硬件适配、模型选型、文件处理链路与知识库构建,尤其强调中文OCR支持、结构化文档提取与CPU/GPU混合推理优化,助力非开发

weixin_31968639的博客 493

[Java数据结构与算法] 哈希表(Hash Table)

首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。使用哈希桶能够有效解决数据存放的冲突问题,但是如果冲突严重,估计小集合的效率也会不尽人意,此时可以对小集合进行转化,如每一个桶的底层是一个哈希表 / 搜索树。虽然哈希表一直在和冲突做斗争,但在实际使用过程中,我们认为哈希表的冲突率是不高的,冲突个数是可控的。由于哈希表底层的空间大小往往是小于所要存储的数据的容量大小的,因此,

REGARD712的博客 1211

从病毒分析到安全研究:手把手教你用OD破解加壳程序的反调试机制

本文深入探讨了如何识别并绕过加壳程序的反调试机制,特别是针对使用IsDebuggerPresent等API检测的防护手段。通过实战案例和工具链配置,详细介绍了逆向工程中的关键技巧,包括内存补丁、硬件断点定位OEP等,帮助安全研究人员有效突破软件保护技术。

tgb345678的博客 823

Java数据结构—哈希表(Hash Table)

数据结构—哈希表

Rxq_Future的博客 883

[特殊字符] 2026终极实战:Python爬取得物App球鞋实时交易价格 —— 从签名破解到数据可视化全栈指南

价格敏感度:热门鞋款(如Air Jordan 1、Yeezy 350、Dunk SB)价格每分钟都在波动,短线套利空间巨大。稀缺性:限量发售、联名款、地区限定,导致供需关系实时变化。数据壁垒:得物App使用自研WMS签名算法设备指纹绑定动态请求头加密,是爬虫工程师的“练兵场”。本博客将手把手带你从零搭建一套生产级得物球鞋价格爬虫系统,涵盖:抓包与逆向分析(mitmproxy + Frida)签名算法逆向(Python复刻)设备模拟与心跳保活(ADB + uiautomator2)

2201_76125261的博客 1125

【深度学习】脸部修复,CodeFormer,论文,实战

Blind face restoration是一个高度 ill-posed 的问题,通常需要辅助引导来 1) 改善从降级输入到期望输出的映射,或者 2) 补充在输入中丢失的高质量细节。在本文中,我们展示了在一个小的代理空间中学到的离散码本先验可以通过将盲目的面部恢复建模为 a code prediction task来大大减少恢复映射的不确定性和模糊性,同时为生成高质量面部提供丰富的视觉元素。

q742971636的博客 2994

数据结构-Java实现散列表

概念散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表

jrn1012的专栏 3838

【ArcGIS Pro微课1000例】0065:制作千层饼多图层叠加效果

右键dem图层,点击符号系统,在右侧的符号系统窗口中,选择拉伸,勾选【显示名称】和【显示全部】,选择高程色带7。由于数据具有高程源,因此可以将数据进行三维显示。右键地面→添加高程源图层。打开ArcGIS PRo,新建一个局部场景,命名为千层饼。设置了高程源数据之后,千层饼一下子就变成了三维形状。数据默认都是在一个平面上,以默认的符号系统显示。到此为止,每个图层均为平面的千层饼已经做好了。将TIN图层的高程偏移设置为-1000。最后将等高线的高程设为2000.移除工程默认加载的图层。默认即可,不需要做修改。

智慧空间实验室 1155

Java学数据结构(4)——散列表Hash table & 散列函数 & 哈希冲突

1.散列表,key,散列函数; 2.哈希冲突的解决; 3.string中的hashCode;

Arya的博客,专注后端领域 1421

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java学数据结构(4)——散列表Hash table &amp; 散列函数 &amp; 哈希冲突_java 散列表

另外,保证所有的单元都能被探测到也是很重要的(但在下面的例子中这是不可能的,因为表的大小不是素数)。例如,关键字可能是完整的街道地址,散列函数可以包括街道地址的几个字符,也许还有城市名和邮政编码的几个字符。有些程序设计人员通过只使用奇数位置上的字符来实现他们的散列函数,这里有这么一层想法:用计算散列函数节省下的时间来补偿由此产生的对均匀地分布的函数的轻微干扰。下面的技术将会排除这个缺撼,不过这要付出计算一个附加的散列函数的代价。不过,这是不可能的,因为单元的数目是有限的,而关键字实际上是用不完的。

2401_87373774的博客 1358

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Java】数据结构-哈希表(Hash table)

1. 哈希表 哈希表(Hash table),又称散列表。是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 在一般的数组中,元素在数组中的索引位置是随机的,元素的取值和元素的位置之间不存在确定的关系,因此,在数组中查找特定的值时,需要把查找值和一系列的元素进行比较。 此时的查询效率依赖于查找过程中所进行的比较次数。 如果元素的值(value)和在数组中的索引(inde

pangpd的博客 313

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Java数据结构与算法】基础篇(6):哈希表

本篇文章: 主要是关于java数据结构与算法的一些基本知识:哈希表。

qq_44366571的博客 362

java 中散列表(Hash Table)和散列集(Hash Set)是基于哈希算法实现的两种不同的数据结构

在 Java 中,散列表(Hash Table)和散列集(Hash Set)是两种不同的数据结构,但它们都基于哈希表的原理来实现。下面是它们的联系与区别、实现类以及各自的优缺点,并用表格进行对比整理。

爱的叹息的专栏 996

Java数据结构之哈希表

Java数据结构之哈希表 哈希表,又称散列表,无论是在Set集合中还是在Map集合中都有它的身影,例如HashTable,HashMap,HashSet,LinkedHashSet等等 在Java中,哈希表采用的数据结构是对象数组+链表的形式: 如上图中,这里的1234…看作是一个个数组单元,在哈希表中被称为哈希桶。 而在哈希桶中,可以存放单个数据,也可以存放多个数据:注意! 当单个哈希桶中的数据数量在1~7之间时采用的是链表形式 当数据个数>=8时,就会由链表转换为红黑二叉树 当数据数量由8个或

weixin_45763962的博客 283

数据结构(Java实现)-详谈哈希表(Hash Table)

1、哈希表介绍 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 (哈希表的底层是数组) 实现哈希表的两种方法: 1、数组+链表 2、数组+红黑二叉树 2、哈希函数H(k) 哈希函数:建立起数据元素的存放位置与数据元素的关键字之间的对应关系的函数。即使用哈希函数可将被查找的键转换为数组的索引。理想情况下它应该运算简单并且保证任

jQueryZK的博客 5821

java数据结构:哈希表(散列表)

java数据结构:哈希表(散列表)

weixin_54046648的博客 321

(Java)数据结构之哈希表(散列表)与哈希冲突

哈希表,散列表,哈希冲突的产生及解决方式 开散列:线性探测,二次探测 哈希的负载因子 闭散列 哈希桶的实现

X_H学Java的博客 1400

Java数据结构——哈希表

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。 本实例使用的是除留余数法。...

jwz934738949的博客 224

java数据结构之哈希表

哈希表是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

weixin_46375204的博客 418

数据结构之哈希表的java实现

哈希表是一种数据结构,提供快速的插入和查找功能。哈希表基于数组存储数据,因此能在O(1)时间内定位数据。关键字值通过哈希函数映射为数组下标。缺点就是数组创建后容量固定,如果数据较多需要不断扩展其长度。 如何将关键字转换为数组下标?这个操作是通过哈希函数完成的。比如,下面就是一个简单的哈希函数, int hash(int key){ return key % array.length;//通过

三分地 5797

JAVA数据结构之哈希表

●散列表(Hash table, 也叫哈希表) ,是根据关键码值(Key value)而直接进行访问的数据结构。●它通过把关键码值映射到表中一个位置来访问记录, 以加快查找的速度。这个映射函数叫做散列函数, 存放记录的数组叫做散列表。●哈希表的核心:private EmpLinkedList[] empLinkedListArray;●哈希表编程思路:先根据对象的信息将其散列,得到 hashCode根据对象的 hashCode 值,找到对应的数组下标,其实就是找到存储对象的链表。

砥砺前行的博客 2253
上一篇: 【Java数据结构】---Map和Set(二叉搜索树)
下一篇: 【Java EE初阶---多线程(初阶)】初识计算机
Optimistic _ chen
博客等级 码龄3年 1553粉丝 127原创
评论 57
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Optimistic _ chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值