处理哈希冲突

embedded/2025/2/22 21:30:51/

有时候哈希表⽆论选择什么哈希函数都⽆法避免冲突,那么插⼊数据时,如何解决冲突呢?主要两种⽅法,线性探测法和链地址法,这篇先做原理描述,下篇实现代码模拟

一、线性探测

发生冲突的位置开始,依次线性向后探测,直到寻找到下一个没有存储数据的位置为止,如果走到哈希表尾,则回绕到哈希表头的位置。

案例:

第一个元素19计算的哈希值为8,所以找到标的位置8,把19塞到这里面,第二个元素30的哈希值也是8,但下标9里面已经有19了,此时出现哈西冲突,用线性探测法解决这个哈希冲突就是依次向后寻找一个没有存储数据的位置,也就是放到下标9的位置,接着5放到下标5,36放到下标3,3放到下标2,20放到下标9,9里面已经有30了,便放到下一个位置10,21放到下标10,下标10已经有20了且走到表尾,没关系,从表头开始依次向后找,我们可以把哈希表看成环的形式,走到表尾之后再继续走到前21放到下标0,12放到下标1,这样就把所有的数据利用线性探测的方式全都存到哈希表里了,如果我想确定一下21这个数有没有存到表中,根我们存储的形式是一样的,首先计算出来它的哈希值为10,从10位置依次向后找看有没有21这个数就可以了

但是有一个致命问题,假设给数组添加一个数据8,8%11=8,存到下标8的这个位置出现哈西冲突,所以要向后探测,发现9 10 0 1 2 3下标都存着数据,直到4的时候才找到空位置,并把8存了进去,因此线性探测是有它的弊端的,如果哈希表里面存的数很密集,有可能要线性探测很多次,这样的哈希表想O(1)来查找以及存储每一个数据是做不到的,其实也有方法解决这个弊端,创建个大一点的数组,比如题目里面有八个数据,可以创建一个是它两倍大小的数组,并且把哈希函数的模数在原有的数值上×2,在它的附近找一个质数去模

二、链地址法

链地址法中所有的数据不再直接存储在哈希表中,哈希表中存储一个指针,没有数据映射这个位置时这个指针为空,有多个数据映射到这个位置时,我们把这些冲突的数据链接成一个链表,挂在哈希表这个位置下面。

案例:

给定数组 a={19,30,5,36,13,20,21,12,24,96},哈希函数为 hash(key)= key % 11;h(19)= 8.h(30)=8.h(5)=5.h(36)=3.h(13)=2h(20)=9.h(21)=10,h(12)=1.h(24)=2.h(96)=8

如上图12的哈希值为1,就会把12以链表的形式挂在下标1上,24和13挂在下标2的哈希表中,以此类推,解释一下,下面8挂着的链表96 30 19,明明是19先插入的,为什么他会在最后,因为这个链表的插入操作是头插

当然它也有弊端,如果所有的数全都冲突挂在下标8,这个链表就会特别长,往后查找一个数的时候,他的时间复杂就变成O(N)了,这个解决方式是不用链表挂,而是用红黑树,这时候时间复杂会变成logN级别


http://www.ppmy.cn/embedded/164105.html

相关文章

阅读《Vue.js设计与实现》 -- 01

菜鸟最近闲暇(大的项目没开始,别的项目基本没事了),不知道干啥(刷掘金刷多了,感觉文章都写得差不多,不知道学什么,原因如下:沸点),所以开始看《Vu…

【转】“小前台,大中台”战略—以阿里云中台设计为例

前言: 当一位设计师拿到中台设计业务的时候,会想什么?别人会怎么评价中台的设计呢?“你这系统才几百人用,有啥价值啊?”“都是内部人员使用,能用就行了,没必要那么极致”“中后台系统人数这么少,你做像人家官网那样做数据统计有什么意义吗?”“你的设计出去讲,观众都…

Pycharm安装教程超详细图文教程,超详细Pycharm安装保姆级教程

文章目录 前言一、环境搭建1. 下载 PyCharm2. 下载 Python3. 安装 Python4. pycharm安装教程 总结 前言 在 Python 编程的广阔天地里,拥有一款强大且称手的集成开发环境(IDE)至关重要。PyCharm 作为 JetBrains 公司推出的一款专业 Python ID…

手机功耗BugReport字段含义介绍

BugReport一般用来分析功耗问题,例如休眠待机,后台待机,游戏,视频,相机场景等 BugReport字段含义介绍 BugReport字段 含义 备注 Reboot 设备的重启事件 CPU running CPU运行状态,休眠 或者 唤醒 只有…

科技赋能体育:Xsens MVN Analyze如何重塑运动训练新纪元

在哈尔滨亚洲冬季运动会备战期间,各国代表队都在积极使用新技术帮助运动员提升成绩。Xsens MVN Analyze运动分析系统以其高精度的数据采集与快速生成分析报告等特点,正在悄然改变着传统运动训练的模式,为运动员成绩提升开辟了新的路径。 一、…

EXCEL解决IF函数“您已为此函数输入太多个参数”的报错

IF函数的基本结构是IF(条件, 值为真时的结果, 值为假时的结果),所以标准的IF函数最多只能有三个参数。当用户输入的参数超过三个时,Excel就会报这个错误。比如多个IF语句叠加,但可能在嵌套的过程中没有正确关闭每个IF函数的括号,导…

【Ubuntu】GPU显存被占用,但显示没有使用GPU的进程

文章目录 一、问题描述二、解决方案2.1 寻找问题进程2.2 尝试杀死相关进程2.3 投放核弹,一键全杀2.4 再次查看GPU使用情况 参考资料 一、问题描述 今天使用服务器的时候发现gpu被占了很多内存,但是使用 nvidia-smi 命令并没有发现占这么多显存的进程&am…

Kubernetes 使用 Kube-Prometheus 构建指标监控 +飞书告警

1 介绍 Prometheus Operator 为 Kubernetes 提供了对 Prometheus 机器相关监控组件的本地部署和管理方案,该项目的目的是为了简化和自动化基于 Prometheus 的监控栈配置,主要包括以下几个功能: Kubernetes 自定义资源:使用 Kube…