处理哈希冲突

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

一、线性探测

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

案例:

第一个元素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级别

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装MySQL9.1.0-winx64.msi的报错解决办法:Database initialization failed。(也适用9.2.0)

csdn上有很多关于安装MySQL9.1.0-winx64.msi的报错(Database initialization failed)的解决办法,根据报错log便签内容总结一下有以下几种: 1、电脑名称有中文的,参考这篇: 【MySQL】Windows上安装MySQL时…

聊一聊vue如何实现角色权限的控制的

大家好,我是G探险者。 关于角色与权限控制,通常是分为两大类:一种是菜单权限;一种是操作权限。 菜单权限是指,每个角色对应着可以看到哪些菜单,至于每个菜单里面的每个按钮,比如增删改查等等这类…

使用 OpenTelemetry 和 Langtrace 的 Elastic 分发跟踪基于 RAG 的聊天机器人

作者:来自 Elastic Bahubali Shetti 如何使用 Elastic 观察基于 OpenAI RAG 的应用程序。使用 Langtrace 对应用程序进行检测,收集日志、跟踪、指标,并了解 LLM 在 Kubernetes 上使用 OpenTelemetry 的 Elastic Distributions 的运行情况。 目…

掌握.NET Core后端发布流程,如何部署后端应用?

无论你是刚接触.NET Core的新手还是已有经验的开发者,在这篇文章中你将会学习到一系列实用的发布技巧与最佳实践,帮助你高效顺利地将.NET Core后端应用部署到生产环境中 目录 程序发布操作 Docker容器注册表 文件夹发布 导入配置文件 网站运行操作 …

VSCode配置C/C++开发环境|最新教程202502

📢 ‌Windows版VSCode配置C/C开发环境(单文件多文件全解析)‌ 一、 ‌环境准备‌ ✅‌必需工具‌:Visual Studio Code 2025‌ ✅扩展插件‌:C/C(Microsoft官方扩展)📢 这个必须安…

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025) 本文内容需要你有一定的 Linux 操作基础,最好是程序员那种,英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统&#xff0c…

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…

【从0做项目】Java文档搜索引擎(9)烧脑终章!

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 文章导读 阿华将发布项目复盘系列的文章,旨在: 1:手把手细致带大家从0到…

cs106x-lecture12(Autumn 2017)-SPL实现

打卡cs106x(Autumn 2017)-lecture12 (以下皆使用SPL实现,非STL库,后续课程结束会使用STL实现) travel Write a recursive function named travel that accepts integers x and y as parameters and uses recursive backtracking to print all solution…

vue取消全选功能按钮注意事项

这里这个功能是通过各种条件查出数据,但只取一条数据进行后续业务,虽然每一条数据前面都有多选框,但只需要选一个,所以在业务上分析可以把这个全选按钮取消掉 这里不是简单的把多选组件的selection-change"handleSelectionChange"和handleSelectionChange方法去掉,因…

三维扫描仪:如何快速获取产品外部结构尺寸?

在精密制造与质量控制领域,传统测量方法因接触式检测效率低、数据维度单一等问题,正面临数字化升级的迫切需求。 传统测量方法的局限性: 传统的测量工具,如卡尺、千分尺和三坐标测量仪,虽然在精度上有一定的保证&…

无人机避障——感知篇(采用Livox-Mid360激光雷达获取点云数据显示)

电脑配置:Xavier-nx、ubuntu 18.04、ros melodic 激光雷达:Livox_Mid-360 1、安装激光雷达驱动 下载安装Livox-SDK2 如果git clone不了,在github上下载相应的zip进行手动安装,安装网址如下: https://github.com/L…

ubuntu22.04使用minikube安装k8s

ubuntu使用minikube安装k8s 准备工作安装步骤安装docker安装kubectl安装minikube导入相关镜像安装相关指令启动minikube服务 安装dashboard组件导入相关镜像创建服务账号安装组件本体验证安装结果 准备工作 下载离线安装包,安装包内容如下: 软件说明ki…

西门子1200下载、上传程序。

下载 第一种 直接点击图标下载,此种方式PLC会停机。 第二种 这三种的区别: 上传 创建新的项目。

基于Openlayers对GeoServer发布的数据进行增删改

使用GeoServer进行图斑数据管理 本文将介绍如何使用GeoServer进行图斑数据的新增、删除和修改。我们将通过一个Vue.js应用来演示这些功能。 设置Vue.js应用 首先,我们设置Vue.js应用,并添加必要的组件和交互逻辑。 Check.vue Check.vue文件包含初始…

自动化之ansible(二)

一、ansible中playbook(剧本) 官方文档: Ansible playbooks — Ansible Community Documentation 1、playbook的基本结构 一个基本的playbook由以下几个主要部分组成 hosts: 定义要执行任务的主机组或主机。 become: 是否需要使用超级用户…

函数执行中的栈和寄存器调用

函数执行中的栈和寄存器调用 函数执行过程中主要用到的寄存器有程序计数器和栈指针。 程序计数器(IP):指向下一条执行指令的地址,其值用%rip来表示 栈指针:指向栈顶地址,其值用%rsp来表示 当过程P调用过…

纯新手教程:用llama.cpp本地部署DeepSeek蒸馏模型

0. 前言 llama.cpp是一个基于纯C/C实现的高性能大语言模型推理引擎,专为优化本地及云端部署而设计。其核心目标在于通过底层硬件加速和量化技术,实现在多样化硬件平台上的高效推理,同时保持低资源占用与易用性。 最近DeepSeek太火了&#x…

建筑兔零基础自学python记录22|实战人脸识别项目——视频人脸识别(下)11

这次我们继续解读代码,我们主要来看下面两个部分; 至于人脸识别成功的要点我们在最后总结~ 具体代码学习: #定义人脸名称 def name():#预学习照片存放位置path M:/python/workspace/PythonProject/face/imagePaths[os.path.join(path,f) f…

【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略

应对消息丢失、重复、顺序与积压的全面策略 引言kafka消息丢失生产者消费者重复消费顺序消费消息积压生产者消费者其他RabbitMQ消息丢失生产者事务机制,保证生产者发送消息到 RabbitMQ Server发送方确认机制,保证消息能从交换机路由到指定队列保证消息在 RabbitMQ Server 中的…