哈希表分析

一、哈希表的概念

哈希表是一种新型的数据结构,它有两个重要的特点:

1.关键词查找

2.最优最快的查找算法

下面我用个例子来介绍它的结构和特点:

例如我们用学生的姓名作为关键字,来进行数据的查询

我们就要定义一个Hash函数,将数据用<K,V>这样的形式形成对应

英语字母有26个,我们将这26个字母相应赋予数字,用学生的姓名中的拼音首字母编号值相加求和,得到一个数,可知此值的最小值是3,最大值为78

 

然后,我们就可以建立一个78大小的数组,将编号对应的学生的信息存进去



 
这样比如我们在查找“刘丽”这个学生的信息时,就不用遍历数组了而是将它的编号算出来,取表中的第24条记录就可以了。

当然,肯定会有冲突产生,比如有“刘丽”和“刘乐”,这样的话数据怎样进行存储呢?

下面就介绍两种方法:

1.开放定址法

对于那些发生冲突的记录,用下列方法进行再次确定哈希地址

Hi=(H(key)+di) MOD m i=1,2,...,k(k<=m-1)

其中 H(key)为哈希函数,m为表长,di为增量序列

如果di值可能为1,2,3,...m-1,称线性探测再散列。

如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2),称二次探测再散列。

如果di取值可能为伪随机数列。称伪随机探测再散列。

2.再Hash法

(1)开散列法

 在哈希表中添加一个指针域,有冲突的第一条记录放在表内,其他的记录通过指针把他们连接起来。

例如:

ps:哈希函数不详,结构如此。。。。。



 

 


(2)闭散列方法

将所有的记录直接存入散列表中。每条记录有一个哈希地址,如果要插入一个记录R,而已有记录已经占用了R的基本位置h(key),则把记录R放在表中的其他位置,由冲突解决方案来确定具体放在哪个位置!

3.关于哈希表

对于哈希表而言,冲突是不可避免的,而我们所做的优化就是将冲突尽量减少!

哈希表并不是由数组和链表构成的数据结构,而是我们解决哈希冲突的方法决定了它的结构组成,如果用再hash中的开散列方法我们得到的是数组与链表结合的哈希表,而如果用闭散列方法则得到的是数组结构的哈希表。

最重要的的点是:哈希表是最优最快的查找算法,它的属性是Key与Value的对应。我们做的是如何将Key与Value均匀散列的对应,而不是寻求链表和数组的均衡!

 

总结:这几天一直在纠结负载因子的问题,今天恍然大悟,大师说的对,我们应该首先探索事物的本质。
 
 
 

第二大脑的觉醒:一个寄生在代码里的小生命,如何悄无声息地接管我的工作流 所有记忆都存在本地。 阅读详情

相关推荐

可信数据空间:可信空间、区域功能节点、业务功能节点、连接器的关联关系

可信数据空间通过分层架构实现安全数据共享:可信空间作为顶层制定全局规则;区域功能节点协调辖区内功能节点协作;功能节点提供具体数据服务;连接器作为唯一通信通道确保安全交互。系统采用"规则自上而下约束,数据自下而上流动"机制,通过分层治理和标准化连接,在保证数据主权的同时实现跨域协作,具有策略分级执行、去中心化治理等特性,支持灵活扩展业务场景。

友莘居士的博客 1687

爆破root密码hash John the Ripper

官方网站:http://www.openwall.com/john/下载:wget http://www.openwall.com/john/j/john-1.8.0.tar.gz解压:tar -xvf john-1.8.0.tar.gz进入src目录:cd john-1.8.0 &amp;&amp; cd src[java] view plain copyroot@ubuntu:/usr/loc...

火车开过况且况且况且 3521

告别Root!用Python脚本一键解密Android微信EnMicroMsg.db数据库(附完整源码)

本文详细介绍了如何在非Root环境下使用Python脚本一键解密Android微信EnMicroMsg.db数据库。通过ADB调试接口和SQLCipher技术,实现自动化提取和解密微信聊天记录数据库,无需Root权限,适合数据分析师和普通用户安全备份数据。

weixin_29266007的博客 331

哈希树简介

哈希树(Hash Tree),在密码学及计算机科学中是一种树形数据结构,每个叶节点均以数据块的哈希作为标签,而除了叶节点以外的节点则以其子节点标签的加密哈希作为标签。哈希树能够高效、安全地验证大型数据结构的内容,是哈希链的推广形式。哈希树的概念由瑞夫·墨克于 1979 年申请专利,故亦称墨克树(Merkle tree)。

Doublelv 的博客专栏。 4353

PCIe控制器深度解析-RK3588 PCIe子系统核心模块探秘

本文深度解析了RK3588芯片中PCIe子系统的核心架构与功能模块。文章将PCIe控制器比作智能交通枢纽,详细阐述了RADM、XADM、CDM、eDMA等核心模块的工作原理,包括数据流管理、地址转换、DMA加速及电源管理。旨在帮助开发者和硬件工程师深入理解RK3588 PCIe控制器的内部机制,为驱动开发、性能优化和故障排查提供清晰的思路与实用指导。

weixin_29246195的博客 189

Windows下Codex CLI binary报错排查与修复完整指南

在Windows开发环境中,命令行工具与图形界面应用的协同工作常常依赖于系统环境变量的正确配置。Codex CLI作为一款基于Node.js的智能编程命令行工具,其可执行文件(binary)的定位机制直接关系到桌面应用的正常启动。当用户执行npm更新或切换Node版本后,Codex CLI二进制文件路径可能发生漂移,从而触发“Unable to locate the Codex CLI binary”的报错。此类问题并非代码或账号异常,而是PATH路径、环境变量刷新及桌面应用缓存共同作用的结果。本文面向Wi

weixin_28718769的博客 305

汽车网络信息安全-软件认证

如上,我们已经知道,VBT会存储每个Data Block的hash values。这样,虽然可以快速验证每个Data Block的完整性,但是,有一个前提:VBT记录的信息是完整且有效的。只有VBT记录的信息是完整的、有效的,再进行每个Data Block的完整性验证才是有意义的。所以,需要先对VBT也进行一次hash计算(eg:使用SHA256计算),生成的hash values称为Root Hash Values。

2301_76563067的博客 1435

15、电科院FTU检测标准学习笔记-基本性能

作者简介:本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验。

sixtome 1865

哈希(Hash)和哈希树(Merkle tree)

哈希(Hash)和哈希树(Merkle tree) 哈希函数(英语:Hash function)又称散列函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值/哈希值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。 散列函...

u011250186的博客 3018

改进yolov8|BackBone改进:PWConv、FasterNeXt替换yolov8主干网络

各位哥哥姐姐弟弟妹妹大家好,我是干饭王刘姐,主业干饭,主业2.0计算机研究生在读。和我一起来改进yolov8变身计算机大牛吧!本文中的论文笔记都是刘姐亲自整理,原创整理哦~

weixin_44379985的博客 752

【华为OD机试真题 新系统】1021、API请求日志去重分析 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1021、API请求日志去重分析 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备

KJ.JK 146

哈希指针-抗篡改的数据结构

哈希指针替换传统指针 使得一个数据结构具备抗篡改特性

dadenny的博客 2905

从零开始讲DDR(5)——读懂Datasheet

对于开发人员来说,需要根据实际场景和使用的需要,使用不同厂家,不同型号的DDR,虽然原理上大同小异,但是还是有一些细节上的需要注意的地方,接触一个新的DDR芯片,首先就是需要找到对应的datasheet,而能都读懂datasheet,也是一个硬件工程师的必备技能。

apple_53311083的博客 5223

算法设计与分析——散列表/哈希表(Hash Table)(三):散列表原理

直接寻址技术的缺点是非常明显的:如果全域U很大,则在一台标准的计算机可用内存容量中,要存储大小为∣U∣|U|∣U∣的一张表TTT也许不太实际,甚至是不可能的。还有,实际存储的关键字集合KKK相对UUU来说可能很小,使得分配给TTT的大部分空间都将浪费掉。 当存储在字典中的关键字集合KKK比所有可能的关键字的全域UUU要小许多时,散列表需要的存储空间要比直接寻址表少得多。特别地,我们能将散列表的存储需求降至Θ(∣K∣)\Theta(|K|)Θ(∣K∣),同时散列表中查找一个元素的优势仍得到保持,只需要O(1)

冯·诺依曼 1万+

Devexpress16.2.6破解工具

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

算法设计与分析——散列表/哈希表(Hash Table)(一):基础知识

许多应用都需要一种动态集合结构,它至少要支持插入、删除和查找字典操作。 例如,用于程序语言编译的编译器维护了一个符号表,其中元素的关键字为任意字符串,它与程序中的标识符相对应。散列表是实现字典操作的一种有效数据结构。尽管最坏情况下散列表中查找一个元素的时间与链表中查找的时间相同,达到了O(n)O(n)O(n)。然而在实际应用中,散列查找的性能是极好的。在一些合理的假设下,在散列表中查找一个元素的平均时间是O(1)O(1)O(1)。 散列表是普通数组概念的推广。由于对普通数组可以直接寻址,使得能在O(1)O(

冯·诺依曼 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

算法设计与分析——散列表/哈希表(Hash Table):完全散列

使用散列技术通常是个好的选择,不仅是因为它有优异的平均情况性能,而且当关键字集合是静态时,散列技术也能提供出色的最坏情况性能。所谓静态,就是指一旦各关键字存入表中,关键字集合就不再变化了。一些应用存在着天然的静态关键字集合,如程序设计语言中的保留字集合,或者CD-ROM上的文件名集合。一种散列方法称为完全散列,如果该方法进行查找时,能在最坏情况下用O(1)O(1)O(1)次访存完成。 我们采用两级的散列方法来设计完全散列方案,在每级上都使用全域散列。下图描述了该方法: 第一级与带链接的散列表基本上是一样的

冯·诺依曼 1万+

VB摄像头监控

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

算法设计与分析——散列表/哈希表(Hash Table)(五):开放寻址法

在开放寻址法中,所有的元素都存放在散列表里。也就是说,每个表项或包含动态集合的一个元素,或包含NoneNoneNone。当查找某个元素时,要系统地检查所有的表项,直到找到所需的元素,或者最终查明该元素不在表中。不像链接法,这里既没有链表,也没有元素存放在散列表外。因此在开放寻址法中,散列表可能会被填满,以至于不能插入任何新的元素。该方法导致的一个结果便是装载因子aaa绝对不会超过1。 开放寻址法的核心思想是,如果出现了散列冲突,我们就重新探测一一个空闲位置,将其插入。比如,我们可以使用线性探测法。当我们往散

冯·诺依曼 1万+

算法设计与分析——散列表/哈希表(Hash Table):散列函数

本文将讨论一些关于如何设计好的散列函数的问题,并介绍三种具体方法。其中的两种方法(用除法进行散列和用乘法进行散列)本质上属于启发式方法,而第三种方法(全域散列)则利用了随机技术来提供可证明的良好性能。 好的散列函数的特点 一个好的散列函数应(近似地)满足简单均匀散列假设:每个关键字都被等可能地散列到mmm个槽位中的任何一个,并与其他关键字已散列到哪个槽位无关。遗憾的是,一般无法检查这一条件是否成立,因为很少能知道关键字散列所满足的概率分布,而且各关键字可能并不是完全独立的。 有时,我们知道关键字的概率分布。

冯·诺依曼 1万+

散列表Hash Table(哈希表)+散列函数+散列冲突及散列表插入、查找的时间复杂度分析

但这个键key有时不是纯数值,不能够做为数组的下标,这时就可以把这个非纯数值的key转为数值作为数组的下标,转换可以使用散列函数进行转换。当查找、删除一个元素时,我们同样通过散列函数计算出对应的槽,然后遍历链表查找或者删除,平均情况下基于链表法解决冲突时查询的时间复杂度是O(1),散列表可能会退化为链表,查询的时间复杂度就从O(1)退化为O(n),将链表法中的链表改造为其他高效动态的数据结构如红黑树,查询的时间复杂度是O(logn)。将链表法中的链表改造成红黑树,可以防止DDos攻击。

sunyunfei1994的博客 666

算法设计与分析——散列表/哈希表(Hash Table):直接寻址表

当关键字的全域UUU比较小时,直接寻址是一种简单而有效的技术。假设某应用要用到一个动态集合,其中每个元素都是取自于全域U={0,1,⋯ ,m−1}U=\{0, 1, \cdots, m-1\}U={0,1,⋯,m−1}中的一个关键字,这里mmm不是一个很大的数。另外,假设没有两个元素具有相同的关键字。 为表示动态集合,我们用一个数组,或称为直接寻址表,记为T[0,1,⋯ ,m−1]T[0, 1, \cdots, m-1]T[0,1,⋯,m−1]。其中每个位置,或称为槽,对应全域UUU中的一个关键字。下图描绘

冯·诺依曼 1万+

散列表分析

设计散列函数需要一定的技巧 ① 一个散列函数在某种意义上必须是“随机的”,以便能将数据充分地散开 ② 但同时作为一个函数,它也应该是“一致性”,以便我们每次执行该函数时都能得到相同地结果 我们来看一个例子 某个Web服务器维护了250个当前在线用户的IP地址,250个IP地址不断变化 怎么设计存储结构 用IP作为索引的数组结构,速度快但是耗费空间 232 用链表,只存储250个IP地址,但每...

qq_42146775的博客 437

散列表(哈希表的实现以及详细分析)

看了b站的视频关于散列表的代码实现,我个人又加了自己的理解,注解了散列表各个代码的具体功能,应该比较详细 class HashTable: """哈希表的建立""" def __init__(self): self.size=11 #初始化哈希表的大小,这里建议选取质数作为初始大小(否则在解决冲突时如果使用开放定址法会出现死循环导致数据无法存放的问题) self.slots=[None]*self.size #初始化key的列表 self.da

m0_46377561的博客 290

散列表有关的知识点分析

元素是6个,表长是7(下标从0-6),我们对上述数据依次对7进行取余,21➗7=3余0,所以21放入0位置,23➗7=3余2,所以23放入2号位,以此类推,我们发现9取余之后也是2,但是2已经满了,这就是所谓的出现了冲突。例如:我们对上述数据元素对11进行取余,11和22对11取余均是0,11放入0号位,22就放入0号位的下一位,我们看到下标为①的,就是进行了一次操作,一次就找到位置,②的是两次操作。例2,我们是看数据元素中,数值最大的数,作为表长,数字是几,就放入下标为几的位置。

2503_92676673的博客 1746

散列表的性能分析

平均查找长度(ASL)用来衡量散列表查找效率:成功(ASLS),不成功(ASLU) 关键词的查找次数,取决于产生冲突的多少,影响冲突多少的三个主要因素 1.散列函数是否均匀 2.处理冲突的方法 3.散列表的装填因子α 1.线性探测法查找性能 期望探测p满足: 2.平方探测法和双散列探测法查找性能 期望探测p满足: 3.分离链法 期望探测p满足: ...

蒟蒻本蒻的博客 370

【leetcode】记录与查找:哈希表的题型分析

本期主要讲解了关于hash函数的力扣相关题型,两数之和,存在重复字符2,字母异位词分组

GGBond778的博客 2164

Linux内核哈希表分析与应用

前言: 1.基本概念: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 2. 常用的构造散列函数的方法 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。散

lmjjw的专栏 798
上一篇: 运算符小记
下一篇: Hadoop集群搭建之jdk和ssh无密码配置
rootke
博客等级 码龄12年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值