哈希表讲解

【细谈数据结构】最最最详细的散列表(哈希表)讲解!!!(三) 最全最细最生动的散列表(哈希表)讲解!!! 入门小白都能轻轻松松看懂!!! 阅读详情

哈希表也称散列表,是一种数据结构,在JAVA集合中的HASHMAP,HASHTABLE都运用了哈希表.

它可以提供快速的插入操作和查找操作,不论有多少数据项,插入与删除只需要接近常量的时间:O(1)时间级.

在计算机程序中,如果需要在一秒种内查找上千条记录,通常使用哈希表.

哈希表的速度明显比树快.树的操作通常需要O(N)的时间级.哈希表不仅速度快,而且编程实现也相对容易.

但哈希表也有缺点,它是基于数组的,数组一旦被创建,就难以扩展.某些哈希表被填满时,性能急剧下降.,所以程序员必须清楚表中要存储多少数据.

哈希表操作的平均时间是基于统计特性而不是随机输入的期望值.

 

哈希表的重要特性就是哈希函数.

我们用一个将大数(或解释为数的字符串)映射成一个较小的,更容易管理的数的函数来达到这个目的.

将一个项映射成一个较小的下标的函数称为哈希函数.

 

需要哈希函数,是因为哈希表是基于数组的,而且关键字值的范围通常比数组容量大.,关键字值通过哈希函数映射为数组的下标.

在JAVA中,通过取模运算来实现.arrayIndex=hugeNumber %smallRange,这就是一个简单的哈希函数.

哈希函数简化了操作,但也带来了不可避免的麻烦:两个或更多的不同项可能被散列到同一个位置,引起冲突.

 

哈希函数不仅要容易计算,而且要对键值的分布要均匀.如果有太多的冲突,哈希表的性能将显著下降.

对于下面的哈希函数:

 

public static int hash(String key , int tableSize){

      int  hashVal = 0;

      for(int i=0;i<key.length;i++){

          hashVal+=key.charAt(i);

}

return  hashVal%tableSize;

}

 

这个哈希函数很简单,很容易实现,计算哈希值也非常快,但这是个糟糕的哈希函数.

假设tableSize很大,为10000,再假设所有的关键字值的长度都是8个或少于8个字符.因为一个ASCII char是一个0到127之间的整数,那么哈希函数的值介于0到1016(127*8)之间,这个限制肯定不会产生一个均匀的分布.

 

为了减少冲突:

1.       开放地址法

2.       链地址法

 

开放地址法:

让指定的数组大小两倍于需要存储的数据量.

因此,可能一半的单元是空的.当冲突发生时,一个方法是通过系统的方法找到数组的一个空位,并把这个单词填入,而不再用哈希函数得到的数组下标.

链地址法:

    创建一个存放单词链表的数组,数组内不直接存储单词.这样,当发生冲突的时候,新的数据项直接接到这个数组下标所指的链表中.

 

开放地址法

在开放地址法中如果数据不能直接放在由哈希函数中,就得寻找空白位置,其中有简单的三种探索方法.

线性探索法,二次探索法,再哈希法.

线性探索法:就是当通过哈希函数找到的位置有冲突时,再沿着数组下标递增向下探测,例如:寻找到1002置,但已经有数据,就向1003,1004….寻找.

当哈希表越来越满的时候,哈希表的性能就会严重降低.并且填充序列越来越长,这种现象称为聚集.

哈希表的容量总是选一个质数.这可以使数据均匀分布.因为哈希函数是以表长为模运算.

例如,表长为15(下标0到14),有一特定的下标0,步长为5,那么只能是0,5,10,0,5,10….以此类推,一直循环下去.只探索到三个单元.表长为13,就会有0,5,10,2,7,12,4,一直下去,只要表中有一空位,就一直探测下去,由于任何数想整除它都是不可能的,所以会探测到所有单元.

 

如果哈希表越来越满,都必须扩展数组,而且不能简单的把旧数组中的数据一一拷贝到新数组的相应位置,因为数据项的位置是由数组的长度计算而来的.所以必须重新按照哈希函数给定数据项的位置.这也就是重新哈希化.这是一个耗时的过程.

 

为了降低聚集,运用二次探索法,已填入哈希表的数据项和表长的比率叫做装填因子.当装填因子不太大的时候,聚集分布得比较连贯,哈希表中可能一部分有大量的聚集,而另一部分比较稀疏.聚集降低了哈希表的性能.

二次探索法的思想就是探测相隔较远的单元,而不是线性探测的相邻的单元.

如果数组下标为x,在线性探测中,是x+1,x+2,x+3…..而在二次探测中,是步数的平方,x+ ,x+ .....

如果表的大小为素数且负载因子不大于0.5,所有的探测将会到达不同的单元,项总是能被插入的.

 

一旦负载因子到达0.5就得立刻扩展数组.

 

在二次探索法中也有二次聚集现象,但二次聚集只是一个很小的理论缺陷.

 

为了消除原始聚集及二次聚集现象,可以用再哈希法也称双重散列,原始聚集及二次聚集的原因是因为它们的探测步长都是固定的.

现在找到产生一种依赖于关键字的探测序列,而不是每个关键字都一样.这样即使有关键字被映射到同一个数组下标,也可以有不同的探测序列.

 

方法是把关键字用不同的哈希函数再做一次哈希化.这个结果作为步长.对于指定的关键字,步长在整个探测过程中都是不变的,不过不同的关键字使用不同的步长.

     第二个哈希函数必须符合以上两个要求:

1.       和第一个哈希函数不一样

2.       不能输出0,否则将没有步长,每次探测将是原地踏步,算法将无法进行.

 

专家发现以下哈希函数形式很好:

stepSize = constant – (key % constant ) 其中constant为质数,并且小于数组容量.

 

 

链地址法

在开放地址法中,寻找一个减少冲突的方法,

在链地址法中,数据项的关键字值还是映射到数组下标,而数据本身保存在每个单元的链表中.

此方法概念上去开放地址法简单,但代码相对复杂,因为它涉及到链表机制.

此方法中的装填因子不同于开放地址法,因为哈希表中N个单元要存储N个或更多的数据项.装填因子一般为1,或大于1.

当然如果链表中有许多项,存取时间变长,找到初始单元的时间为O(1),而搜索链表的时间与链表中的数据项数目M成正比,为O(M).因此并不希望链表太满.

在开放地址法中,当装填因子超过二分之一或三分之二的时候,哈希表的性能就严重下降.在链地址法中,装填因子达到1以上,而且对性能没有多在影响,因此链地址法比开放地址法更键壮,尤其是不清楚要存储多少数据项的时候.

 

还有一种方法类似于链地址法,它在哈希表的每个单元用的是数组,而不是链表.这样的数组有时称为桶.这种方法并没有链地址法有效,因为桶容量不好选择.太小会溢出,太大浪费空间.

 

 

   对于哈希函数的经验就是既简单又快,而且去掉关键字中的无用数据,并尽量全用关键字的所有数据.

 

在实际情况中,装填因子取决于存储速度与效率之间的平衡.装填因子变小,效率下降,但速度上升..

【细谈数据结构】最最最详细的散列表(哈希表)讲解!!!(二) 最全最细最生动的散列表(哈希表)讲解!!! 入门小白都能轻轻松松看懂!!! 阅读详情

相关推荐

【Halcon】双目立体视觉引导机械手有序抓取,案例分享

本文介绍了一个基于双目视觉的工件定位与抓取系统。该系统使用两个工业相机组成双目视觉系统,通过标定获取相机参数,采用模板匹配算法识别任意摆放且可能交叠的工件。重点阐述了三维坐标获取方法,特别是通过Z方向高度实现有序抓取的策略。文章详细说明了系统搭建、双目标定、模板创建等关键步骤,并展示了特征点匹配和定位结果。该案例为初学者和开发者提供了双目视觉系统的基本实现参考,展示了机器视觉与机械手协同工作的典型应用场景。

机器视觉从业者 2489

哈希表

槽总数的选择 关键码范围较小 关键码范围较大 简单的哈希函数 冲突解决策略 开哈希法 闭哈希法 哈希:把关键码值映射到表中的位置来访问记录的过程 哈希函数:将关键码值映射到位置的函数 槽:哈希表中的一个位置 冲突:不同的关键码经过哈希函数哈希后,映射到相同槽的情况 探查序列:冲突解决策略的闭哈希方法中,如果基位置冲突,需要根据探查函数查找下一个空槽,这个过程产生的序列加上基位...

yhc166188的博客 372

LVGL配置文件lv_conf.h详解

lv_conf.h是一个用户级别的文件,它不属于内核的部分,因此,在不同的工程中,该文件有可能存在差异。lv_conf.h文件具有两大功能:(1)配置功能:内存、屏幕刷新周期、输入设备的读取周期,等等;(2)裁剪功能:使能失能某些功能,有效地优化Flash的分配。

qq_28576837的博客 5559

数据结构HASH总结一:理论学习篇

数据结构HASH总结一:理论学习篇  数据结构HASH总结二:程序学习篇 数据结构HASH总结三:实践基础篇 数据结构HASH总结四:程序高级篇 数据结构HASH总结五:Nginx中的HASH(version 0.1) 转载请注明出处http://blog.youkuaiyun.com/yankai0219/article/details/8185796 零、学习方法

www.keything.net 1万+

【短路计算篇】短路电流计算详解:从理论到实践

短路电流是指在正常电路中电势不同的两点之间发生阻抗极小的故障而引起的过电流。短路时电流强度很大,可能达到额定电流的10-15倍,大容量电力系统中短路电流可达数万安。简单比喻:短路就像水管突然爆裂,水流瞬间增大很多倍,对管道系统造成巨大冲击。短路电流计算是电气系统设计中的基础性工作,关系到整个系统的安全运行。通过本文介绍的各种计算方法,工程师可以根据具体情况选择合适的方法进行准确计算。

2301_81299416的博客 3960

利用 vivado实现加减法器的设计

本科计组实验:利用 vivado实现加减法器的设计

qq_52052302的博客 1万+

哈希表(数据结构11章——读书笔记)

哈希表哈希化简介关键字作为索引有序字典哈希化冲突开放地址法线性探测聚集冲突删除是否允许重复值扩展数组二次探测步骤是步数的平方再哈希法链地址法哈希函数哈希化的效率哈希化和外部存储 哈希表是一种数据结构,它可以提供快速的插入操作和查找操作。 哈希表不仅速度快,编程实现也相对容易。 哈希表的缺点: 它是基于数组的,数组创建后难于扩展。某些哈希表被基本填满时,性能下降的非常严重,所以程序员必须清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。 而且也没有一种简便的方法可以以任

m0_47447562的博客 1584

ardupilot 为什么要采样四元数姿态控制

本节主要说明清楚ardupilot姿态控制为什么要用到四元数,欢迎批评指正!!!

陌城烟雨 1117

【浅谈数据结构】《数据结构》Data Structure

《数据结构》60’ 一、栈(stack)、队列(Queue)、向量(Vector) 1、链表 带哨兵节点链表了解清楚 链表要会写,会分析。各种链表。 2、栈 LIFO(last in first out)先存进去的数据,最后被取出来,进出顺序逆序。即先进后出,后进先出。 ADT Stack{ 数据对象:D= {Ai |Ai属于ElemSet,i = 1,2,3,…,n,n>0} 数据关系:R1 = {<Ai-1,Ai>,Ai>Ai-1,Ai属于D,i = 2,…,n} An端为栈

谁吃薄荷糖 2万+

粒子群优化与蚁群算法求解多旅行商问题

它要求在给定一组城市和旅行商之间的距离矩阵的情况下,找到一条最优的路径方案,使得所有旅行商可以分别从起始城市出发,途径其他城市,并最终回到起始城市,同时总旅行距离达到最小。这两种算法都是基于群体智能的优化算法,在求解组合优化问题时具有较好的性能表现。假设有n个城市需要被m个旅行商访问,城市间的距离由距离矩阵D表示,其中D(i,j)表示第i个城市到第j个城市的距离。粒子群优化算法是一种基于群体智能的优化算法,其中的粒子代表了潜在的解,并通过模拟粒子在解空间中的移动来搜索最优解。一、多旅行商问题建模。

m0_47037246的博客 553

大模型_WIN10使用hyper-v安装Ubuntu24.04虚拟机_配置独立静态IP地址_连接外网_并与内网其他机器互通_通过容器安装Dify_超详细安装过程002--人工智能工作笔记0247

本文详细描述了在Hyper-V环境中配置网络、安装Ubuntu虚拟机、设置IP地址、安装Docker以及部署Dify应用的过程。首先,通过Hyper-V管理器创建外部虚拟交换机(ExternalSwitch),并配置本机、虚拟交换机和Ubuntu虚拟机的IP地址,确保网络互通。接着,在Ubuntu虚拟机中安装Open-VM-Tools和Docker,并配置Docker的国内镜像源。最后,通过Git克隆Dify源码,使用Docker Compose启动Dify应用,完成部署。整个过程涵盖了网络配置、虚拟机管理

添柴程序猿的专栏 1750

HashMap详解

一、HashMap集合简介 HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的 key、value 都可以为 null,此外,HashMap 中的映射不是有序的。 jdk1.8 之前 HashMap 由 数组 + 链表 组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突(两个对象调用的 hashCode 方法计算的哈希值经哈希函数算出来的地址被别的元素占用)而存

java123456111的博客 5万+

认知建模:模拟人类决策过程的AI方法

认知建模的目的在于构建能够模拟人类认知和决策过程的模型,通过AI技术将人类的思维、判断和选择等过程以数字化的形式呈现出来。其范围涵盖了多个领域,包括心理学、人工智能、经济学、管理学等。在心理学领域,认知建模可以帮助研究人员更好地理解人类的认知机制;在人工智能领域,可用于开发具有更智能决策能力的系统;在经济学和管理学中,能辅助进行市场预测、战略规划等决策制定。本文首先介绍认知建模的背景知识,让读者对该领域有初步的了解。接着阐述核心概念和它们之间的联系,通过示意图和流程图直观展示。

AI 算法实战派 1165

【细谈数据结构】最最最详细的散列表(哈希表)讲解!!!(一)

最全最细最生动的散列表(哈希表)讲解!!! 入门小白都能轻轻松松看懂!!!

city_water 8144

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

讲解哈希表

我:这就是哈希冲突,一般的把string转为int后要mod一个数,所以,把string转为int后有可能会一样。我:哈希表是一种理想的搜索方法,可以不经过一次次的遍历,可以直接从表中找到需要检索的元素。小明:阿,今天考试了,我本身能打300分的,可我没写好哈希表,扣了100分,小明:对了,string怎么改为int呢。旁白:wa了,90分(阿,这太不科学了)旁白:小明来了(不知道喊了多少次了)旁白:小明只好不情愿的写了一个哈希表。我:小明,你用哈希表也写一个。我:好的,小明你猜这是为什么。

2301_79101240的博客 373

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

哈希表入门讲解

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。 一个通俗的例子是,为了查找电话簿中某人的号码,可以创建一个按照人名首字母顺序排列的表(即建立人名{\displaystyle x}到首

The_star_is_at的博客 4490

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数据结构:哈希表讲解

数据结构:哈希表讲解

2301_76269963的博客 3501

7000字哈希表总结,图文讲解!

今天我们来说一种新的数据结构散列(哈希)表,散列是应用非常广泛的数据结构,在我们的刷题过程中,散列表的出场率特别高。所以我们快来一起把散列表的内些事给整明白吧,文章框架如下。 说散列表之前,我们先设想以下场景。 袁厨穿越回了古代,凭借从现代学习的做饭手艺,开了一个袁记菜馆,正值开业初期,店里生意十分火爆,但是顾客结账时就犯难了,由于菜品太多,每当结账时,老板娘总是按照菜单一个一个找价格(遍历查找),每次都要找半天,所以结账的地方总是排起长队,顾客们表示用户体验很差。袁厨一想这不是办法啊,太浪费大家.

JAVA一木的博客 417

哈希表全面讲解

哈希表存储内容是<key,value>,意思就是你要存储的值(value)要给他设计一个标签方便查询。举个例子:你要去图书馆找书,你想看《笑话大全》你会把所有地方的书全遍历一遍吗?显然不会,你首先会去找文学区休闲类,如果首字母是‘x’的书都存在4号书架,你就直接去4号书架找就非常方便了。而且现在有智能图书,你在手机app输入笑话大全(key)app会直接告诉你位置(value)

zcy278854的博客 403

哈希表 详细讲解

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

舒克日记的博客 645

使用哈希表(散列表)+顺序二叉树实现电话簿系统(手把手讲解)

哈希表与顺序二叉树,链表

weixin_75111785的博客 2531

【知识讲解】 哈希表的介绍与实现

哈希表无论是在应用还是在算法中都有非常多的体现,接下来,跟随小编的视角来了解一下哈希表和他的实现吧。let's go!!!!!!!!<1>不同的Key经过哈希计算后,映射到同一个数组下标,该现象称为哈希冲突。<2> 示例:3\%200 与 203\%200 结果均为3,两个键会争夺同一个位置。:存储键值对pair<K,V>,附带节点状态标识;:内部维护HashDate类型数组,记录当前有效数据个数_n。这篇文章我们认识到了哈希表的实现,接下来,小编还会带来哈希表的的更多知识,敬请期待~

2501_93971468的博客 737

哈希表(hash table)概念详解(这可能是你能找到的最详细讲解)

以前在美国学Java数据结构的时候,因为当时是插班生,临时选的数据结构,其实当时还没学Java,听到hash table一脸懵逼,回公寓在goole和百度上也没有找到比较完整的解释,最近在看python数据结构的时候又重新研究了一下这个点,感觉了解的还挺透彻的,放出来和大家分享一下。 一、哈希和哈希表 二、哈希思想在信息领域的应用 三、哈希的设计和性质 四、常用的哈希函数 五、冲突消解技术

冯良骏 的 博客 4058
上一篇: Oracle EM相关知识
下一篇: java中计算两个日期相差几天
JavaMan_KA
博客等级 码龄16年 12粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值