哈希表的概念(散列表)

大话数据结构-查找-散列表查找(哈希表) 对散列技术进行介绍,同时介绍散列表的构建方法,包括直接定址法、数字分析法、平方取中法、折叠法、除留余数法和随机数法,并介绍了开放定址法、再散列函数法、链地址法、公共溢出区法等冲突解决办法,并对开放定址 阅读详情

一、基本概念

散列表特点 :
数据元素的关键字与存储地址直接相关

通过哈希函数建立“关键字”与“存储地址”的联系

若不同的关键字通过散列函数映射到同一个值,则称它们为 “同义词”
通过散列函数确定的位置已经存放了其他元素,则称这种情况为 “冲突”


二、常见散列函数

1. 除留取余法—H(key)=key%p

表长为m,取不大于m但最接近或等于m的质数

2.直接定址法—H(key)=a*key+b

适合 关键字分布基本连续 的情况

3. 数字分析法—选取数码分布较为均匀的若干位作为散列地址

在这里插入图片描述

4.平方取中法—取关键字的平方值的中间几位作为散列地址

在这里插入图片描述

散列查找是典型的 “用空间换时间” 的算法,只要散列函数设计的合理,则散列表越长,冲突的概率越低。

三、处理冲突的方法

1.拉链法

用拉链法处理“冲突”:把所有“同义词”存储在一个链表中
在这里插入图片描述

2.开放定址法

空地址既对同义词开放,又向非同义词开放。其数学递推公式为
H i = ( H ( k e y ) + d i ) % m H_i=(H(key)+d_i)\%m Hi​=(H(key)+di​)%m
其中 i ∈ [ 0 , m − 1 ] i\in[0,m-1] i∈[0,m−1],m表示散列表表长, d i d_i di​为增量序列;H(key)表示初始地址;i理解为“第i次发生冲突”

(1) 线性探测法

d i = 0 , 1 , 2 , . . . , m − 1 d_i=0,1,2,...,m-1 di​=0,1,2,...,m−1

1存储操作
即发生冲突时,每次往后探测一个单元(向后挪1单元)。若为空,放入,若发生冲突,则接着挪

【易错点】
H ( k e y ) = k e y % p H(key)=key\%p H(key)=key%p
H i = ( H ( k e y ) + d i ) % m H_i=(H(key)+d_i)\%m Hi​=(H(key)+di​)%m
m和p不一定相等
例如:
在这里插入图片描述
n=13;p为不大于n且与n互质的数,为13
m为表长为16
H ( 25 ) = 25 % 13 = 12 H(25)=25\%13=12 H(25)=25%13=12
H 1 = ( 12 + 1 ) % 16 = 13 H_1=(12+1)\%16=13 H1​=(12+1)%16=13

查找操作与存储操作类同。当查找到第一个空位,仍未找到,则查找失败。(例如查找21,从位置8开始查找,直到位置13,仍未找到。查找失败)

缺点:

(2) 平方探测法

d i = 0 , 1 , − 1 , 2 2 , − 2 2 , 3 2 , − 3 2 . . . . d_i=0,1,-1,2^2,-2^2,3^2,-3^2.... di​=0,1,−1,22,−22,32,−32....

存储操作
即发生冲突时,以H(key)为,向右向左探索。若为空,放入;若左右都冲突,探测下一个平方值,直至找到空位(eg. H(key)=9, 若10和8都冲突,探测13和5,以此类推)

【注意】:

  1. 在平方探测法中,由于偏移量有负,故要处理 H i = ( H ( k e y ) + d i ( i ) ) % m < 0 H_i=(H(key)+di(i))\%m<0 Hi​=(H(key)+di(i))%m<0的情况。处理方法为:当 d i ( i ) < 0 时, H i = ( H ( k e y ) + d i ( i ) + m ) % m di(i)<0时,H_i=(H(key)+di(i)+m)\%m di(i)<0时,Hi​=(H(key)+di(i)+m)%m
  2. 在平方探测法中,散列表长度m必须是一个可以表示为4j+3的素数,才能探测到所有位置
(3) 伪随机序列法

d i = 0 , 5 , 24 , 11 , . . d_i=0,5,24,11,.. di​=0,5,24,11,..或其他给出的伪随机序列
与以上两种操作类同,不再赘述

散列表性质与实现 原文转自:  http://blog.youkuaiyun.com/intrepyd/article/details/4359818 阅读详情

相关推荐

【C++】哈希表

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。

m0_63852285的博客 2211

数制转换的除留余数法的原理

举例 原理 整数都可以表示为以2为底的幂组成的多项式(二进制) 整数对2取余,得到二进制下的个位数a0 用商对2取余,得到二进制下的十位数a1 Z=an2n+an−12n−1+…+a222+a121+a020=2×[an2n−1+an−12n−2+…+a221+a1]+a0=2×[2×(an2n−2+an−12n−3+…+a2)+a1]+a0\begin{aligned} Z &= a_{n}2^{n} + a_{n - 1}2^{n - 1} + \ldots + a_{2}2^{2} +

zhkc9866的博客 2391

哈希表—超简单的理解思路

一、啥是哈希表 哈希表又称散列表,其实就是和数组、链表一样的是一种数据结构,在你从来没有接触过这个概念的时候,觉得神秘而不可探测,其实就是一纸老虎,人狠话不多,先上一个相对官方的概念定义: 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。建立了关键字与存储位置的映射关系,公式如下: 存储位置 = f(关键字) 这里把这种...

shanshenyuyou的博客 1595

Day27——哈希表

由昨天的顺序表和折半查找知道,查找的效率取决于关键字比较的次数。哈希表是根据关键字而进行直接访问的数据结构,建立了关键字和存储地址之间的一种直接映射关系。 但哈希表都避免不了地址冲突,处理冲突的方法: 1、开放定址法:存放新表项的空闲地址既向它的同义词表项开放,又向它的非同义词表项开放,公式为:Hi=(H(key)+di)%m(m表示哈希表表长,di为增量序列)H_i=(H(key)+d_i) \%m(m表示哈希表表长,d_i为增量序列)Hi​=(H(key)+di​)%m(m表示哈希表表长,di​为增量序

Z__XY_的博客 815

Halcon深度学习2 -- 标注工具Deep Learning Tool下载安装

Deep Learning Tool为Halcon开发公司MVTec官方提供的一款标注工具: 标记培训数据是任何深度学习应用程序的关键的第一步。 当涉及到应用程序的性能,准确性和健壮性时,此标记数据的质量起着重要作用。 借助MVTec深度学习工具,我们正在为HALCON用户创建全面流畅的深度学习体验。 通过开发我们自己的解决方案,我们确保可以将其输出无缝集成到HALCON中。 该应用程序还使我们能够吸收在开发HALCON深度学习算法时获得的丰富经验和专业知识,而该算法自然也涉及很多标签! Deep.

fengyingv的博客 1万+

避坑指南:SAP成本中心分割结构配置常见错误及解决(含KA06/KL01前置步骤)

本文深入解析了SAP成本中心会计中分割结构配置的关键步骤与常见错误。重点强调了配置前必须通过KA06创建次级成本要素(类别42)和通过KL01创建活动类型这两个核心前置步骤,并详细剖析了在OKES中定义分割规则及版本时的高频报错原因与解决方案,帮助顾问和运维人员有效规避配置陷阱,确保成本分摊的准确性。

pear55的博客 865

哈希表冲突及处理冲突的方法(含例子)

哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表成为哈希表。基本思想:首先在元素的关键字K和元素的位置P之间建立一个对应关系f,使得P=f(K),其中f成为哈希函数。创建哈希表时,把关键字K的元素直接存入地址为f(K)的单元;查找关键字K的元素时利用哈希函数计算出该元素的存储位置P=f(K).

Super_King_的博客 3658

保姆级教程:断网环境下用Flexnet服务器搞定SolidWorks 2021安装与破解(附错误5解决方案)

本文提供SolidWorks 2021在断网环境下的企业级部署指南,详细解析Flexnet服务器本地化工作原理,并给出安装与破解的实战方案,特别针对常见的'错误5'问题提供多维度解决方案。适用于需要内网隔离或移动办公的工业设计场景,确保数据安全与授权合规。

weixin_28683391的博客 296

哈希查找方法

哈希法的过程如下图 目录 一、散列函数构造方法 1.1 直接定址法 1.2 除留取余法 1.3 数字分析法 1.4 平方取中法 散列函数构造方法总结: 二、处理冲突的方法 2.1 开放地址法 2.1.1 线性探测法 2.1.2 平方探测法 2.1.3 再散列法 2.1.4 伪随机序列法 2.2 拉链法 一、散列函数构造方法 1.1 直接定址法 这种方法不会产生冲突 适合关键字分布基本连续,否则会产生大量空位置 1.2 除留取余法 假定散列表表长为m,p取一.

Anthony_4926 4203

01-FreeSWITCH 的安装、部署、配置以及可能遇到的问题和解决方法

一文让您了解从FreeSWITCH 的安装、部署、配置、可能遇到的问题及解决方法。一切从实际项目出发,以工程应用为目的。

秋风的博客 2127

STM32F103串口接收中断:USART_IT_IDLE和USART_IT_RXNE区别

2:如果是大于1个byte的数据,在不用DMA的情况下,同时使能USART_IT_RXNE,USART_IT_IDLE中断,每收到一个字节在中断中把数据存到缓存中,待收到USART_IT_IDLE中断时,收完整帧数据,然后再解析处理数据。比如:如上图在初始化时,同时开启了两个中断,如果传送8个字节的数据,就会产生8个USART_IT_RXNE,和1个USART_IT_IDLE中断。(如果接收到数据,在1个byte的时间内,没有收到新数据,就认为是数据传送完成,产生空闲USART_IT_IDLE中断)

weixin_66299220的博客 2399

散列表(哈希表)

散列表(哈希表)

weixin_61611746的博客 4346

Quartus II 13.1 出现 ‘‘can‘t find design entity <Filename>‘‘ 问题的解决方法

Quartus II 13.1 出现 ''can't find design entity '' 问题的解决方法

qq_62076686的博客 1万+

散列表(哈希表)(一)散列表的概念

散列方法不同于顺序查找、二分查找、二叉排序树及B-树上的查找。它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,无须任何比较就可以找到待查关键字,查找的期望时间为O(1)。 散列表的概念 1、散列表  设所有可能出现的关键字集合记为U(简称全集)。实际发生(即实际存储)的关键字集合记为K(|K|比|U|小得多)。  散列方法是使用函数h将U映射到表T[...

aizongmao2539的博客 164

组合预测 | Python实现LSTM-XGBoost长短期记忆网络组合极限梯度提升树股票价格预测

组合预测 | Python实现LSTM-XGBoost长短期记忆网络和极限梯度提升树股票价格预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 2353

【系统架构设计师】预测试卷十:综合知识(75道选择题)

本文包含75道选择题,覆盖计算机系统、操作系统、网络、数据库、软件工程等核心知识域,其中系统架构设计与评估占比最高(19题)。题目难度稍高,注重灵活应用,题干全新且不与前8套重复。部分典型题目解析包括:计算机性能比较(CPU时间公式TLB/页表机制)、Cache写策略、流水线分支惩罚、管程条件变量、LRU近似算法、自旋锁适用场景、TCP字节流特性、Anycast应用、MVCC机制、分布式事务选型等。答案详解强调易错点,如性能比较需综合计算、TLB缺失不等于缺页、

数据知道的博客 478

[一篇详解哈希表]数据结构之哈希表(散列表)

✅作者简介:大家好,我是Philosophy7?让我们一起共同进步吧!🏆 📃个人主页:Philosophy7的csdn博客 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博>主哦🤞 文章目录散列表简介:为什么需要散列表?哈希函数的实现哈希表的代码 散列表 简介: 散列表又可以叫做哈希表,那什么是散列表呢? 现在就让我们深入研究一下吧 是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把.

Philosophy7的博客 2402

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数据结构——哈希表(散列表)

文章目录一,哈希表(散列表)概念二,哈希(散列)函数的构造哈希(散列)函数的构造原则构造方法平方取中法折叠法保留余数法三,冲突处理散列冲突的方法开放定址法1.线性探测法2.二次探测法3.随机探测法再散列函数法公共溢出区法链地址法四,代码实现1.哈希函数2.链表和哈希表的创建3.哈希表初始化3.从哈希表中根据key查找元素4.哈希表插入元素5.元素删除6.哈希表销毁 一,哈希表(散列表)概念 大话数据结构里面是这样介绍的: 散列表,又称为哈希表(Hash table),采用散列技术将记录存储在一块连续的存储空

m0_61705102的博客 1万+

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

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

面试八股之集合篇6.1——散列表——散列表(哈希表)HashTable概述

🔥本篇概览:详细讲解了散列表(哈希表)的性质

做一个善良的人,做好自己的事,如果愿意,再发一份光。 971

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

详解Python中的可哈希对象与不可哈希对象(一)——哈希表与哈希值

前言:我们经常会听见很多的概念,哈希值,哈希表,可哈希对象,不可哈希对象,散列表,字典,映射,等等,那么这么多的概念后面到底又有什么区别和联系,它们的本质又是怎么样的,本此系列文章将针对这些概念进行说明,鉴于篇幅较多,本次系列文章将分为两篇来说明,此为第一篇,介绍数据结构哈希表与哈希值。 一、什么是哈希表与哈希值 1.1 从一个简单的现象说起 顺序存储的结构类型需要一个一...

MIss-Y的博客 1万+

C++数据结构——哈希表

c++、数据结构、哈希表

2303_78442132的博客 2828

探索散列表和哈希表:高效存储与快速检索的魔法

本文将带你深入了解散列函数的原理,学习散列表和哈希表的概念、操作以及解决冲突的方法,让你能够理解并应用这些数据结构来解决实际问题。了解散列函数的原理、学习散列表和哈希表的概念与操作,以及解决冲突的方法,将有助于你更好地理解并应用这些数据结构。散列函数是散列表和哈希表的核心组成部分,它的作用是将输入数据映射为一个固定大小的索引,即哈希值(Hash Value)。一个好的散列函数应当能够将不同的输入映射为尽可能分散的哈希值,减少冲突的概率。选择适当的散列函数和解决冲突方法是优化散列表性能的关键。

学IT,找陈寒 923

【高级数据库】第二章 第03讲 散列表

【高级数据库】第二章 数据库索引    第03讲 散列表 1、散列表的构造   通过对关键字与存储地址之间建立的映射结构称为散列函数(哈希函数或哈希映射),通过散列函数将关键字映射到的值称为散列地址(哈希地址),保存散列地址及对应的数据则是散列表(哈希表)。   在散列 fff 中,假设关键字为 keykeykey,目标则是设计一个散列函数 y=f(key)y=f(key)y=f(key) 使得给...

夏栀的博客 844

【C语言】散列表(哈希表)

简述散列表,以及C语言代码实现

weixin_44348253的博客 1395
上一篇: B+树的概念
下一篇: unordered_map在C++中的用法+实例
快苏排序OAO
博客等级 码龄5年 273粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

快苏排序OAO

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

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

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

打赏作者

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

抵扣说明:

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

余额充值