处理哈希冲突

news/2025/2/21 7:51:09

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

一、线性探测

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

案例:

第一个元素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.niftyadmin.cn/n/5860489.html

相关文章

常用的性能优化方法和技巧

常用的性能优化方法和技巧 前端性能优化 减少HTTP请求:就好比你去超市买东西,每次请求就像你跑一趟超市。去的次数越多,花在路上的时间就越多。所以把多个小的资源,像图片、脚本这些,合并成一个大的,就能…

#渗透测试#批量漏洞挖掘#畅捷通T+远程命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概况 二、攻击特征 三、应急处置…

selenium爬取苏宁易购平台某产品的评论

目录 selenium的介绍 1、 selenium是什么? 2、selenium的工作原理 3、如何使用selenium? webdriver浏览器驱动设置 关键步骤 代码 运行结果 注意事项 selenium的介绍 1、 selenium是什么? 用于Web应用程序测试的工具。可以驱动浏览…

详解同为科技桌面PDU系列产品特点

同为科技的桌面PDU系列产品是依据自身在电气联接领域25年专业积累并精心设计,产品采用模块化结构,实现各种功能、输出插口、输入方式可根据用户需求以模块组合的方式构建定制化产品。 桌面PDU产品特点 工业级材质和结构设计 桌面PDU系列产品采用一体成…

计算机专业知识【局域网(LAN)标准与国际标准化组织(ISO)]

在计算机网络领域,局域网(LAN)是一种常见且重要的网络类型。很多人会疑惑 LAN 的国际标准是否由国际标准化组织(ISO)制定,下面我们就来详细探讨这个问题,并介绍 ISO 制定过的一些重要标准。 一…

多进程(1)

1.多任务:让系统同时具备处理多个任务的能力。 2.方法:多进程;多线程; 3.进程:正在执行的程序,需要消耗cpu和内存,一个动态执行的过程。 4.进程和程序的区别: (1&…

UNIAPP开发之利用阿里RTC服务实现音视频通话后端THINKPHP5

下面是一个使用ThinkPHP 5实现后端逻辑的示例。我们将创建一个简单的ThinkPHP 5项目来处理生成推流和播流地址的请求。 后端部分(ThinkPHP 5) 1. 初始化ThinkPHP 5项目 首先,确保你已经安装了Composer。然后使用Composer创建一个新的Think…

leetcode:3110. 字符串的分数(python3解法)

难度:简单 给你一个字符串 s 。一个字符串的 分数 定义为相邻字符 ASCII 码差值绝对值的和。 请你返回 s 的 分数 。 示例 1: 输入:s "hello" 输出:13 解释: s 中字符的 ASCII 码分别为:h 104 …