哈希(散列)方法是对插入的数据通过哈希函数计算出一个哈希地值,并将这个哈希地址作为储存改数据的地址,这样下次再查找这个数据时,只需要通过哈希函数再获取到该地址然后直接去拿就好

这样就做到了不经过任何比较,一次就能从表中拿到元素的O(1)的时间复杂度,他将哈希函数计算出来的值和目标值建立了一一映射的关系

比如有一个数组大小为5  下标为0 1 2 3 4

再插入值时,我对他进行 %5 取余操作,再储存2时就映射到了下标2,于是将值放到数组下标2的位置,%5 这就是一个简单的哈希函数而构建出来的表(这个数组)就称为哈希表(散列表)

冲突

对于刚刚的例子,很容易看出单数据多了,就会出现不同的数据映射到相同的位置,这种不同的数据通过哈希函数计算出来了相同的哈希地址,就称为哈希冲突或者哈希碰撞,把具有相同哈希值但是不是相同的数据称为同义词

冲突的避免

要知道哈希冲突时不可解决的,但数据量大之后,什么可能都会出现,而我们能做的是减低冲突率

避免哈希函数的最有效的办法是优化哈希函数,哈希函数计算出来的地址应该要平均分布到空间中,如果有m个地址,那么哈希函数计算出来的值就应该平均的分布到0 - m-1

负载因子的调节

负载因子的定义 α = 数据的总数 / 哈希表的长度

α是哈希函数装满程度的标注因子,且发送哈希冲突的可能性和α成正比,因为数据越多,发送哈希冲突的可能性更大

所以要降低冲突率就要减低负载因子,而储存数据的总数是不能变的,于是需要扩大哈希表的大小

冲突的解决分为开散列和闭散列

闭散列

当冲突发生时,哈希表还没有被填满,所以表中一定还有空的位置,那么就找出这个空的位置来放冲突元素

线性探测

若计算出的哈希地址冲突了,就往后继续探测一个空的位置,直接放入

再删除元素的时候,采用的是标志位的伪删除法,因为使用线性探测法,一个哈希地址对应的有可能是多个元素,而这其他的元素,要基于这个哈希地址来往后查找,如果这个位置被删除了,那么就表示这里就没有元素,而和他冲突的元素也就不存在了

二次探测

线性探测的缺点是冲突元素容易产生堆积,这于寻找下一个位置有关系,因为是挨个挨个找到空位置,而二次探测为了避免该问题是跳着寻找空位置的,寻找下标的公式是

,也可以是h0-i^2,Hi是最终的下标,H0是计算出来的冲突地址,m是表大小,i是1 2 3.... 是动态递增的,冲突一次i就加一

有研究表明,但α 小于0.5时,新的数据一定能插入,且任何位置都不会被探测俩次,因此再还有一般的空位置时,就不会存在冲突的情况,那么再搜索时就不用考虑冲突的情况,但如果大于了0.5就要考虑扩容表了

所以哈希表对空间的利用率比较底,这是哈希的缺陷

开散列 哈希桶

开散列又叫链地址法,将冲突的元素归于一个集合,每一个子集称为一个桶桶中的元素又链表联系起来

实现:在哈希表中储存的是一个链表,当冲突的元素就直接储存再这个链表中,再查找时就先通过哈希函数找到这个链表,再遍历这个链表来获取到元素,因为冲突的次数一般都是常熟级的,所以遍历这个链表的时间也可以近似忽略,所以搜索还是O(1) 的复杂度

但当元素过多之后,遍历这个链表所需要的时间也不能被接受了,于是这个桶也可以是另一个哈希表或者是一颗搜索树

虽然哈希的发展是一直在和哈希冲突做斗争,但是我们在平时使用时,哈希冲突发送的情况也不是很频繁,对于增删查改的时间复杂度视为是O(1)  的

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模-评价类问题-优劣解距离法(TOPSIS)

1-AI带你认识TOPSIS📘 一、TOPSIS 方法简介1. ​​基本定义:​​​​TOPSIS(Technique for Order Preference by Similarity to an Ideal Solution)​​,中文通常称为:•​​优劣解距离法​​•​​逼近理想…

Go协程:从汇编视角揭秘实现奥秘

🚀 Go协程:从汇编视角揭秘实现奥秘 #Go语言 #协程原理 #并发编程 #底层实现 引用: 关于 Go 协同程序(Coroutines 协程)、Go 汇编及一些注意事项。 🌟 前言:重新定义并发编程范式 在当今高并发…

MySQL 事务(重点)

MySQL 这个东西注定是可能会被多个用户/客户端来同时访问的,这是肯定的,MySQL 中存放的都是数据,数据可能有一个上层线程在用,也有可能另一个线程也要用...数据是被所有人共享的,所以就注定了 MySQL 这样的服务在一个时…

uniapp:h5链接拉起支付宝支付

场景:APP内点击支付宝支付,后台返回类似链接https://qr.alipay.com/bax***********c3050 通常做法是,使用plus.runtime.openURL(deeplink);先打开浏览器,浏览器会提示打开支付宝,之后是支付流程。现在可以省略跳转h5的…

吴恩达 Machine Learning(Class 3)

Week 11.1 K-means Cluster centroidK-means 是无监督学习中聚类算法的一种,核心在于更新聚类质心;首先将每个点分配给几个聚类质心,取决于那些点离哪个质心更近;然后将几个聚类质心移动到分配给他的所有点的平均值,不…

MyBatis 动态查询语句详解:让 SQL 更灵活可控

MyBatis 动态查询语句详解:让 SQL 更灵活可控 在日常的数据库操作中,我们经常会遇到需要根据不同条件拼接 SQL 语句的场景。比如查询用户时,可能需要根据姓名、年龄、性别等多个条件进行筛选,而这些条件往往是动态变化的 —— 有时…

Java基础语法three

一、一维数组一维数组初始化数据类型[] 数组名new 数据类型[数组长度]//动态初始化数据类型[] 数组名new 数据类型[]{值}//静态初始化数据类型[] 数组名{值}数组长度一旦确定,就不可更改。数组是序排序;数组属于引用数据类型的变量,数组的元素…

【数据结构】排序算法全解析:概念与接口

1.排序的概念及其运用 1.1 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的…

在 CentOS 7 上使用 LAMP 架构部署 WordPress

CentOS 7 LAMP 架构部署 WordPress全步骤本文将详细介绍如何在 CentOS 7 系统上通过 LAMP(Linux Apache MariaDB PHP)架构部署 WordPress 博客平台。 在CentOS 7上基于LAMP架构部署WordPress 一、系统基础配置 1. 修改主机名(本机IP&#…

Node.js导入MongoDB具体操作

在Node.js应用程序中,导入MongoDB是一项常见任务。本文将详细介绍如何在Node.js中连接和操作MongoDB数据库,包括安装必要的包、配置连接、执行基本的CRUD操作等步骤。1. 安装必要的包首先,确保你已经安装了Node.js和npm。然后,通过…

HTML--pre标签的作用

原文网址&#xff1a;HTML--pre标签的作用-CSDN博客 简介 本文介绍HTML里pre标签的作用。 <pre> 元素表示预定义格式文本。里边的文本会保留原格式&#xff0c;以等宽字体的形式展现出来&#xff0c;文本中的空白符&#xff08;比如空格和换行符&#xff09;都会显示出…

机器学习--数据预处理

目录 一、数据清洗&#xff1a;让数据纯净如新 1、缺失值处理&#xff1a; 2、异常值处理 3、重复值处理 二、数据变换&#xff1a;重塑数据的 “形状” 1、归一化 2、标准化 三、总结与展望 机器学习小白必看&#xff1a;数据预处理实战笔记 最近投身于机器学习的学习…

Python 数据可视化:Matplotlib 与 Seaborn 实战

Python 数据可视化&#xff1a;Matplotlib 与 Seaborn 实战​​​​在当今数据驱动的时代&#xff0c;数据可视化成为了理解和传达数据信息的关键手段。Python 作为一门强大的编程语言&#xff0c;拥有丰富的数据可视化库&#xff0c;其中 Matplotlib 和 Seaborn 尤为突出。本文…

计算机网络技术学习-day4《路由器配置》

目录 一、路由器基础认知 1. 路由器的核心功能 2. 路由器与交换机的区别 二、路由器配置基础操作 1. CLI&#xff08;命令行界面&#xff09;模式体系 2. 基础配置命令示例 &#xff08;1&#xff09;基础信息配置 &#xff08;2&#xff09;接口IP地址配置&#xff08;…

IDEA(十四) IntelliJ Idea 常用快捷键(Mac)

目录准备&#xff1a;Mac键盘符号和修饰键说明一、编辑类快捷键二、Search/Replace&#xff08;查询/替换&#xff09;三、编译、运行四、debug 调试五、Navigation&#xff08;导航&#xff09;六、Refactoring&#xff08;重构&#xff09;七、VCS/Local History八、Live Tem…

八月月报丨MaxKB在教育及教学科研领域的应用进展

在2025年5月的“MaxKB用户应用月度报告”中&#xff0c;我们对MaxKB开源智能体平台在教育行业的典型应用场景进行了总结。MaxKB在教育行业的应用主要集中在教学辅助、学术研究、校园服务、行政办公、财务管理、招生等场景。 目前&#xff0c;“DeepSeekMaxKB”的组合正在被包括…

一周学会Matplotlib3 Python 数据可视化-绘制自相关图

锋哥原创的Matplotlib3 Python数据可视化视频教程&#xff1a; 2026版 Matplotlib3 Python 数据可视化 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程讲解利用python进行数据可视化 科研绘图-Matplotlib&#xff0c;学习Matplotlib图形参数基本设置&…

第三十三天(信号量)

非常非常非常.....的重要在共享内存的代码里面p1.c实质是有问题lt._flag 1;//这里先置1if(c Q)sprintf(lt._buf,"quit");elsesprintf(lt._buf,"大家好&#xff0c;%d 我系渣渣辉. %d 是兄弟就来砍我吧!!! %d",i,i1,i2);while(*((int *)shmptr));//如果别…

Scikit-learn通关秘籍:从鸢尾花分类到房价预测

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 决策树/SVM/KNN算法对比 模型评估指标解析 读者收获&#xff1a;掌握经典机器学习全流程 …

rsync + inotify 数据实时同步

rsync inotify 数据实时同步 一、rsync简介 rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步&#xff0c; 支持本地复制&#xff0c;或者与其他SSH、rsync主机同步 二、rsync三种命令 Rsync的命令格式常用的有以下三种&#xff1a;&#…