散列(哈希)查找的定义,常见的散列函数设计以及处理哈希冲突方法

news2025/1/12 23:36:58

1.散列表

1.散列表的定义

散列表(Hash Table),又称哈希表
是一种数据结构,特点是:数据元素的关键字与其存储地址直接相关

特点:

  • 若不同的关键字通过散列函数映射到同一个值,则称它们为“同义词”。
  • 通过散列函数确定的位置已经存放了其他元素,则称这种情况为“冲突”。
2.处理冲突的方法1:拉链法(链地址法)

拉链法(又称链接法、链地址法)处理“冲突”:把所有“同义词”存储在一个链表中

例如:
在这里插入图片描述
优化:在插入新元素时,保持关键字有序,可微微提高查找效率。

2.散列查找

  • 最理想情况:散列查找时间复杂度可到达O(1)。
  • 装填因子α=表中记录数/散列表长度。
  • 装填因子会直接影响散列表的查找效率。

3.常见散列函数的设计

散列函数的设计要结合实际的关键字分布特点来考虑,不要教条化。

对给定的关键字集合,应尽可能均匀地散列到各个地址,使冲突更少。

1.除留余数法

H ( k e y ) = ( k e y ) m o d ( p ) H(key) =( key)mod(p) H(key)=(key)mod(p)
散列表表长为m,取一个不大于m但最接近或等于m的质数p.

  • 质数又称素数。指除了1和此整数自身外,不能被其他自然数整除的数.
  • 用质数取模。分布更均匀,冲突更少。
2.直接定址法

H ( k e y ) = k e y 或 H ( k e y ) = a ∗ k e y + b H(key) = key或H(key) = a*key + b H(key)=keyH(key)=akey+b

  • 其中,a和b是常数。这种方法计算最简单,且不会产生冲突。
  • 适合关键字的分布基本连续的情况
  • 若关键字分布不连续,空位较多,则会造成存储空间的浪费。
3.数字分析法

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

  • 设关键字是r进制数〈如十进制数),而r个数码在各位上出现的频率不一定相同,可能在某些位上分布均匀一些,每种数码出现的机会均等;
  • 而在某些位上分布不均匀,只有某几种数码经常出现,此时可选取数码分布较为均匀的若干位作为散列地址。
  • 这种方法适合于已知的关键字集合,若更换了关键字,则需要重新构造新的散列函数。
4.平方取中法

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

  • 具体取多少位要视实际情况而定。
  • 这种方法得到的散列地址与关键字的每位都有关系,因此使得散列地址分布比较均匀,
  • 适用于关键字的每位取值都不够均匀或均小于散列地址所需的位数。

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

4.处理冲突的方法2:开放地址法

所谓开放定址法,是指可存放新表项的空闲地址既向它的同义词表项开放,又向它的非同义词表项开放。其数学递推公式为∶
H i = ( H ( k e y ) + d i ) m o d ( m ) Hi= (H(key) + di) mod (m) Hi=(H(key)+di)mod(m)
i = 0 , 1 , 2... , k ( k ≤ m − 1 ) i = 0,1,2...,k (k≤m - 1) i=0,1,2...,k(km1),m表示散列表表长;di为增量序列;
i可理解为“第i次发生冲突”

关于增量序列 d i di di的设计有:

1.线性探测法

d i = 0 , 1 , 2 , 3 , . . . , m − 1 ; di=0,1,2,3,..., m-1; di=0,1,2,3,...,m1;
即发生冲突时,每次往后探测相邻的下一个单元是否为空 .

1.查找操作
空位置的判断也要算作一次比较。
越早遇到空位置,就可以越早确定查找失败。

2.删除操作
注意:采用“开放定址法"时,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填入散列表的同义词结点的查找路径,可以做一个“删除标记”,进行逻辑删除。

3.查找效率分析
弊端:当第一次冲突位置离目标较远时,看起来很满,实际上很空,花费较长的时间。

初次探测的地址 Ho只有可能在 [ 0 , 12 ] [0,12] [0,12]

线性探测法很容易造成同义词、非同义词的“聚集(堆积)”现象,严重影响查找效率。
产生原因——冲突后再探测一定是放在某个连续的位置。

2.平方探测法

d i = 0 2 , 1 2 , − 1 2 , 2 2 , − 2 2 , . . . . k 2 , − k 2 di= 0^2,1^2,-1^2,2^2,-2^2, .... k^2,-k^2 di=02,12,12,22,22,....k2,k2时,称为平方探测法,
又称二次探测法其中 k ≤ m / 2 k≤m/2 km/2

  • 平方探测法:比起线性探测法更不易产生“聚集(堆积)”问题。
  • 非重点小坑:散列表长度m必须是一个可以表示成4j+3的素数,才能探测到所有位置。(数论)
3.伪随机序列法

di是一个伪随机序列,如di= 0,5,24,11,…

5.处理冲突的方法3:再散列法

再散列法(再哈希法)︰除了原始的散列函数H(key)之外,
多准备几个散列函数,当散列函数冲突时,
用下一个散列函数计算一个新地址,直到不冲突为止:
H = R H i ( K e y ) i = 1 , 2 , 3.... , k H= RHi(Key) i=1,2,3....,k H=RHi(Key)i=1,2,3....,k

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven 设置环境变量(Windows、Linux)

文章目录 Windows 配置 Maven 环境变量Linux 配置 Maven 环境变量 如果想在任意路径下都能通过 mvn 命令运行 Maven 程序,就需要将 Maven 程序路径设置到环境变量中, 否则使用 mvn 命令时每次都要加上 Maven 程序的全路径 核心就一句话,把 M…

坚鹏:中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期

中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期培训圆满结束 中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力,是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市,2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点…

学习记忆——英语篇——右脑记忆单词

文章目录 英语字母形象起源右脑记忆单词的原则四大步骤第一步:摄取信息第二步:处理信息第三步:储存信息第四步:提取信息 训练例子字母形象训练 右脑记忆单词5大方法字源法编码法字母编码法字母组合编码法 拼音法全拼法拼音组合 熟…

springcloud3 分布式事务解决方案seata之XA模式4

一 seata的模式 1.1 seata的几种模式比较 Seata基于上述架构提供了四种不同的分布式事务解决方案: XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入 TCC模式:最终一致的分阶段事务模式,有…

操作系统:中断和异常

1.中断的作用 CPU上会运行两种程序,一种是操作系统内核程序(是整个系统的管理者),一种是应用程序。 1.中断的特点 在合适的情况下,操作系统内核会把CPU的使用权主动让给应用程序。“中断”是让操作系统内核夺回CPu使…

java智慧园区系统源码 智慧园区小程序源码

java智慧园区系统源码 智慧园区小程序源码 技术框架: 核心框架:Spring Boot 2.4.0 安全框架:JwtPermission 3.1.1 前端:Ant Design Vue 1.6.2 持久层框架:MyBatis-Plus 3.4.1 关系型数据库: Mysql 8.0.22 数据库…

【开发篇】一、热部署

文章目录 1、手工启动热部署2、自动启动热部署3、热部署范围配置4、关闭热部署功能 1、手工启动热部署 日常开发与调试&#xff0c;改几行代码想看效果就得手动点重启&#xff0c;很繁琐&#xff0c;接下来考虑启动热部署。首先引入springboot开发者工具&#xff1a; <dep…

找视频背景音乐素材,就上这6个网站。

找背景音乐、BGM、音效素材&#xff0c;就上这6个网站&#xff0c;国内外都有&#xff0c;免费下载&#xff0c;还可以商用&#xff0c;建议收藏起来~ 1、菜鸟图库 https://www.sucai999.com/audio.html?vNTYwNDUx 菜鸟图库是一个综合性素材网站&#xff0c;站内涵盖设计、图…

ceph分布式存储部署

一、概述 是一个统一的分布式存储系统&#xff0c;设计初衷是提供较好的性能、可靠性和可扩展性。 特点 1、统一存储 虽然 ceph 底层是一个分布式文件系统&#xff0c;但由于在上层开发了支持对象和块的接口。所以在开源存储软件中&#xff0c;能够一统江湖。至于能不能千秋万…

单片机学习--->Keil多文件工程

1、在文件夹中创建新的文件夹 目录&#xff1a; App 文件夹&#xff1a;用于存放外设驱动文件&#xff0c;如 LED、数码管、定时器等。 Obj 文件夹&#xff1a;用于存放编译产生的 c/汇编/链接的列表清单、调试信息、 hex 文件、预览信息、封装库等文件。 Public 文件夹&#x…

D. Edge Split

Problem - D - Codeforces 思路&#xff1a;思路想到了&#xff0c;但是不知道用什么方法写。。首先我们先看只有一个树的情况&#xff0c;那么如果我们所有的边是一个颜色&#xff0c;那么答案是1n&#xff0c;如果我们将其中的一条边变色&#xff0c;那么产生的答案是2n-1&am…

buuctf web [ACTF2020 新生赛]Upload

明了但不明显的文件上传 传个试试 行&#xff0c;抓包吧&#xff0c;php格式不行&#xff0c;就先上传要求的格式&#xff1a;jpg、png、gif 抓到上传的包之后&#xff0c;再修改成我们想要的 常见的php格式绕过有&#xff1a;php,php3,php4,php5,phtml,pht 挨个试试 这是上个…

Python 根据身高体重计算体质(BMI)指数

""" 根据身高体重计算体质(BMI)指数知识点&#xff1a;1、计算公式&#xff1a;体质指数(BMI) 体重(KG) / (身高(M) * 身高(M))2、变量类型转换3、运算符幂**&#xff0c;例如&#xff1a;3 ** 2 9 <> 3 * 34、更多的运用请参考&#xff1a;https://blo…

基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow环境PyQt5环境 模块实现1. 数据预处理 相关其它博客工程源代码下载其它资料下载 前言 本项目采用了矩阵分解算法&#xff0c;用于对玩家已游玩的数据进行深入分析。它的目标是从众多游戏中筛选出最适合…

糖果传递问题(超详细的数论公式推导+贪心结论+均分问题)

糖果传递问题 文章目录 糖果传递问题问题描述问题分析【公式推导过程】代码 问题描述 有 n 个小朋友坐成一圈&#xff0c;每人有 a[i] 个糖果。 每人只能给左右两人传递糖果。 每人每次传递一个糖果代价为 1。 求使所有人获得均等糖果的最小代价。 输入格式 第一行输入一个正…

【2】贪心算法-综述

前言 从前&#xff0c;有一个很穷的人救了一条蛇的命&#xff0c;蛇为了报答他的救命之 恩&#xff0c;于是就让这个人提出要求&#xff0c;满足他的愿望。这个人一开始只要求简 单的衣食&#xff0c;蛇都满足了他的愿望&#xff0c;后来慢慢地贪欲升起&#xff0c;要求做官&am…

基于SSM的出租车管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

智荟康午休课桌椅成为第十届中国慈善展览会公益亮点产品

第十届中国慈善展览会&#xff08;以下简称“慈展会”&#xff09;于9月15日至17日在深圳会展中心隆重举办&#xff0c;此次展会为期3天&#xff0c;主要围绕“共建现代化慈善&#xff0c;聚力高质量发展”的主题&#xff0c;重点聚焦聚力民生福祉&#xff0c;将打造“一展多元…

新手小白如何学习自动化测试?

前言 测试自动化在各个行业和应用中被广泛使用&#xff0c;并产生巨大的效果。软件开发方法&#xff0c;如DevOps、Agile、Waterfall和它们的不同风格&#xff0c;广泛使用测试自动化来降低成本&#xff0c;提高效率和准确性&#xff0c;并加快回归测试。 测试自动化是在充分…

LeetCode 75 - 01 : 最小面积矩形

type pair struct{x, y int }func minAreaRect(points [][]int)int{mp : map[pair]struct{}{}// 将二维数组中的坐标映射到map中for i : range points{mp[pair{points[i][0], points[i][1]}] struct{}{}}// 将结果设置为一个最大值&#xff0c;防止影响求最小值的逻辑res : ma…