哈希冲突

news2024/12/23 23:16:36

为什么会有哈希冲突?

哈希表通过哈希函数来计算存放数据,在curd数据时不用多次比较,时间复杂度O(1)。但是凡事都有利弊,不同关键字通过相同哈希函数可能计算出来相同的存放地址,这种现象被称为哈希冲突。

如何避免哈希冲突?

1.设计合理的哈希函数
  1. 直接定制法

  1. 取关键字的某个线性函数作为哈希地址:Hash = A * Key + B

  1. 优点:简答,均匀

  1. 缺点:需要事先知道关键字的分布情况,

  1. 适合场景:查找比较小且连续的情况

  1. 除留余数法

设哈希表允许的地址数m,取一个<=m,但最接近或者等于m的质数p作为除数,按照哈希函数Hash = key % p,将关键码转换成哈希地址

2.调节负载因子
负载因子 = 元素个数 / 哈希表的容量

如图所示,负载因子越大,发生哈希冲突的可能性越大。又哈希表中元素不能减少,只能扩大哈希表中的数组容量

解决哈希冲突

如果哈希冲突无法避免,又该如何处理哈希冲突呢?
  1. 开放地址法/闭散列

  1. 线性探测

当发生哈希冲突时,如果哈希表没被装满说明还有空位置,那么可以把key存放到冲突位置的“下一个”空位置。

要往哈希表中插入14,hash(14) = 14 % 10 = 4。已经存放了4,就往下找,直到找到空位置(也就是5下标),24,34,44同理。

缺点:1.线性探测把可能冲突的元素,放到一起,挨得很近。
2.不好删除,如果你删除了4,会影响到44的查找
  1. 二次探测

为了解决线性探测大量冲突元素堆积在一起的缺点,使用函数Hi = (H0 + i2 ) % m (其中i = 1,2,3....).H0 是通过哈希函数对元素关键字Key进行计算得到的位置,m表示哈希表的大小,i表示发生冲突的次数

14的下标 (4 + 12 ) % 10 = 5, 24的下标 (4 + 22 ) % 10 = 8

  1. 开散列/哈希桶/链地址法/开链法

首先对关键码集合用哈希函数计算哈希地址,具有相同地址的关键码归于同一子集合,每个子集合称为一个桶,每个桶里的元素通过一个单链表连接起来,各个链表的头节点存储在哈希表中(即数组+链表)。如果冲突非常严重,每个桶的背后变成一棵红黑树(数组+链表+红黑树)

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

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

相关文章

JVM的内存回收及常见算法

什么样的对象应该被回收&#xff1f;某个对象不再被栈直接或间接地引用&#xff0c;此时就应该被回收了。o被指向null的时候&#xff0c;new Object()创建的对象就不在被栈引用了&#xff0c;可以被回收。p1和personList均不再指向第一个Person对象的时候&#xff0c;第一个Per…

【小墩墩学Android】开发常见问题FAQ之Gradle更新

文章目录1、简介1.1 Android简介1.2 Gradle简介1.3 Gradle的配置文件1.3.1 应用模块的 build.gradle1.3.2 项目的 settings.gradle1.3.3 gradle-wrapper.properties2、Gradle文件下载失败2.1 手动下载gradle2.2 配置本地gradle2.3 配置国内镜像3、repositories配置国内源3.1 单…

蓝桥杯三月刷题 第八天

文章目录&#x1f4a5;前言&#x1f609;解题报告&#x1f4a5;分数&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;回文日期&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;迷宫&#x1f914;一、思路:&#x1f60e;二、代码&a…

LVGL学习笔记18 - 表Table

目录 1. Parts 1.1 LV_PART_MAIN 1.2 LV_PART_ITEMS 2. 样式 2.1 设置行列数 2.2 设置单元格字符串 2.3 设置单元格宽度 2.4 设置表格高度和宽度 2.5 设置字符串颜色 2.6 设置边框颜色 2.7 设置背景颜色 3. 事件 4. CELL CTRL 表格是由包含文本的行、列和单元格构…

【Git】Git仓库初始化

Git本地仓库初始化 1.将本地代码上传至远程新建仓库 1.1.建立远程仓库 1.2.初始化本地代码仓库 第一步&#xff1a;进入本地代码目录 cd /代码路径 第二步&#xff1a;初始化仓库(执行如下命令) git init 第三步&#xff1a;将本地全部文件添加到本地缓冲区(执行如下命令)…

循环神经网络原理及实现(二):循环神经网络复现

专栏&#xff1a;神经网络复现目录 循环神经网络 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种神经网络结构&#xff0c;其主要特点是网络中存在循环连接&#xff0c;使得网络具有记忆功能&#xff0c;可以处理序列数据。在传统神经网…

autoxjs

文章目录autojs一、工具二、使用步骤1.手机设置开发模式并打开usb调试2.安装scrcpy3. 安装autoxjs4. vscode插件使用auto 入门语法总结autojs autojs 目前作者已经跑路了&#xff0c;转为用社区的autoxjs&#xff0c;官网地址&#xff1a;http://doc.autoxjs.com/#/ 一、工具 …

Echart的使用初体验,Echarts的基本使用及语法格式,简单图表绘制和使用及图例添加【学习笔记】

Echart&#xff1f; ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求。 ECharts 遵循 Apache-2.0 开源协议&#xff0c;免费商用。 ECharts 兼容当前绝大部分浏览器&#xff08;IE8/9/10/11&#xff0c;Chrome&#xf…

【打造家庭服务器系列01】无桌面版Ubuntu 22.04 连接wifi

一、背景 最近有一台笔记本一直放在哪没用了&#xff0c;就想着拿来做个服务器用吧。 如何安装Ubuntu系统&#xff0c;大家可以百度搜索一下很多。 主要分三步&#xff1a; 制作U盘启动盘&#xff08;推荐使用rufus工具&#xff0c;轻量方便&#xff09;设置BIOS引导 &#x…

java——代理

什么是代理&#xff1a; 给目标对象一个代理对象&#xff0c;由代理对象控制着对目标对象的引用 为什么使用代理&#xff1a; ①&#xff1a;功能增强&#xff1a;通过代理业务对原有业务进行增强 ②&#xff1a;用户只能同行过代理对象间接访问目标对象&#xff0c;防止用…

About What Is a DBA?

1.Evaluating a DBA Job Offer Here are some useful questions to ask: • Does the company offer regular training for its DBAs to learn new DBMS features and functionality? What about training for related technologies such as programming, networking, e-bus…

[NIPS 2017] Improved Training of Wasserstein GANs (WGAN-GP)

Contents IntroductionDifficulties with weight constraintsCapacity underuseExploding and vanishing gradientsGradient penaltyReferencesIntroduction WGAN 增加了 GAN 模型训练的稳定性,但有时仍然会有生成质量不高或难以收敛的问题。作者发现上述问题经常是由 WGAN 中…

保障信息安全:使用PyZbar库识别二维码图片可以快速获取二维码中的信息,保障信息安全。

目录 简介&#xff1a; 源代码&#xff1a; 源代码说明&#xff1a; 效果如下所示&#xff1a; 简介&#xff1a; 不用摄像头识别二维码可以应用在以下场景&#xff1a; 批量处理二维码图片&#xff1a;可以在服务器上使用PyZbar等库来批量处理二维码图片&#xff0c;例如读…

Nginx 配置实例-负载均衡

一、实现效果 浏览器地址栏输入地址 http://192.168.137.129/edu/a.html&#xff0c;负载均衡效果&#xff0c;将请求平均分配到8080和8081两台服务器上。 二、准备工作 1. 准备两台tomcat服务器&#xff0c;一台8080&#xff0c;一台8081 (具体操作如下两个链接) Nginx配置实…

亚信科技新“三驾马车”再创佳绩,与数字经济同频共振

‍数据智能产业创新服务媒体——聚焦数智 改变商业近日&#xff0c;亚信科技公布了2022年财报。财报显示&#xff0c;2022年&#xff0c;亚信科技实现营收77.38亿元&#xff0c;同比上升12.2%&#xff1b;毛利润29.39亿元&#xff0c;同比上升11.1%&#xff0c;毛利率达38.0%&…

分布式链路追踪组件skywalking介绍

SkyWalking组件概念 一个开源的可观测平台, 用于从服务和云原生基础设施收集, 分析, 聚合及可视化数据。SkyWalking 提供了一种简便的方式来清晰地观测分布式系统, 甚至横跨多个云平台。SkyWalking 更是一个现代化的应用程序性能监控(Application Performance Monitoring)系统…

通过Session共享数据验证码进行用户登录

通过Session共享数据验证码进行用户登录 需求&#xff1a; 访问带有验证码的登录页面login.jsp。用户输入用户名&#xff0c;密码以及验证码。 ①。如果用户名和密码输入有误&#xff0c;跳转登陆页面&#xff0c;提示&#xff1a;用户名或密码错误。 ②。如果验证码输入有误…

核方法(kernel Method)

核方法 核方法定义 一种能够将在原始数据空间中的非线性数据映射到高维线性可分的方法。 核方法的用处 1、低维数据非线性&#xff0c;当其映射到高维空间&#xff08;feature space&#xff09;时&#xff0c;可以用线性方法对数据进行处理。 2、线性学习器相对于非线性学…

从MySQL innoDB的特性Doublewrite buffer谈起

文章目录前言什么是Doublewrite buffer为什么要叫它Doublewrite呢&#xff0c;双写分别是哪两次写&#xff0c;体现在了什么地方呢为什么需要Doublewrite bufferDoublewrite buffer的具体使用1.假如还没有进行第一次写的时候crash了&#xff0c;也就是Doublewrite buffer和磁盘…

最大值池化与均值池化比较分析

1 问题在深度学习的卷积网络过程中&#xff0c;神经网络有卷积层&#xff0c;池化层&#xff0c;全连接层。而池化层有最大值池化和均值池化两种情况&#xff0c;而我们组就在思考&#xff0c;最大值池化和均值池化有什么区别呢&#xff1f;两者的模型准确率是否有所不同&#…