数据结构:哈希
哈希函数的概念:哈希函数是哈希表(散列表)的核心组件,其作用是将任意长度的键(Key)映射为固定长度的存储地址,以实现高效的数据存储与检索。以下是哈希函数在数据结构中的关键知识点总结:
一、哈希函数的核心作用
- 快速定位数据
通过哈希函数计算键的哈希值,直接定位到数组中的存储位置,使得插入、删除和查找操作的平均时间复杂度为 O(1)。 - 冲突管理
不同键可能映射到相同地址(哈希冲突),哈希函数的设计需尽可能减少冲突概率,并通过冲突解决策略处理实际冲突。
二、常见哈希函数构造方法
- 直接定址法
- 公式:
H(key) = a*key + b - 特点:适用于键分布连续的场景(如年龄存储),无冲突但空间利用率低。
- 示例:年龄为键时,直接以年龄作为数组下标。
- 公式:
- 除留余数法
- 公式:
H(key) = key % p(p为不大于表长的质数) - 特点:简单高效,需选择合适质数以减少冲突。
- 示例:当表长m=10,选择p=7,键12的哈希值为12%7=5。
- 公式:
- 平方取中法
- 步骤:对关键字平方后取中间几位作为哈希值。
- 适用场景:关键字分布范围大且中间位数较均匀。
- 折叠法
- 方法:将关键字分割为多段后叠加求和(如移位叠加或间界叠加)。
- 适用场景:长关键字且位数分布均匀。
- 随机数法
- 公式:
H(key) = random(key) - 特点:适用于非数值型键,需保证随机性以减少冲突。
- 公式:
三、哈希冲突的解决方案:
一、开放地址法(Open Addressing)
核心思想:当发生冲突时,按规则探测哈希表中的下一个空槽位。
探测方式:
- 线性探测:按顺序向后逐个查找空位。
- 公式:
H_i = (H(key) + d_i) % m,其中d_i = 1, 2, 3, ..., m-1 - 示例:
哈希表长度m=11,哈希函数H(key)=key%11。
插入序列{12, 67, 56, 16, 25, 37}时,37%11=1,但位置1已被25占用。
线性探测后,依次检查位置2(空),插入37到位置2。
- 公式:
- 二次探测:按平方增量跳跃式探测。
- 公式:
d_i = ±1², ±2², ..., ±k² - 示例:
若H(key)=3冲突,探测顺序为3+1²=4→3-1²=2(若2为空则插入)。
- 公式:
- 伪随机探测:通过伪随机数生成增量序列。
- 示例:
若哈希表长度m=11,随机序列为2,5,9,...,冲突时计算(3+2)%11=5,若仍冲突则继续(3+5)%11=8。
- 示例:
二、链地址法(Separate Chaining)
核心思想:将哈希地址相同的元素组成链表,头指针存储在哈希表中。
示例:
哈希表长度13,哈希函数 H(key)=key%13,关键字序列 {32,40,36,53,16,46,71,27,42,24,49,64}。
- 处理结果:
- 地址0:→32→27
- 地址1:→40→53→16→42
- 地址10:→49→64
平均查找长度(7*1 + 4*2 + 1*3)/12 ≈1.5。
三、再哈希法(Double Hashing)
核心思想:冲突时使用第二个哈希函数重新计算地址。
示例:
- 主哈希函数
H1(key)=key%13,冲突时使用H2(key)=7-(key%7)。
插入key=37时,若H1(37)=11冲突,则计算H2(37)=7-2=5,新地址(11+5)%13=3(若空则插入)。
四、公共溢出区法(Overflow Area)
核心思想:单独开辟一个区域存储冲突元素。
示例:
哈希表分为主表 HashTable[0..m-1] 和溢出表 OverTable[0..v]。
- 查找时先查主表,未找到则遍历溢出区。
五.方法对比:
| 方法 | 优点 | 缺点 |
|---|---|---|
| 开放地址法 | 空间紧凑,无需额外结构 | 易产生聚集,删除复杂 |
| 链地址法 | 无聚集,支持动态插入/删除 | 需额外存储指针,空间开销大 |
| 再哈希法 | 冲突概率低 | 计算时间增加 |
| 公共溢出区法 | 实现简单,适合冲突较少场景 | 溢出区过大时效率下降 |
相关文章:
数据结构:哈希
哈希函数的概念:哈希函数是哈希表(散列表)的核心组件,其作用是将任意长度的键(Key)映射为固定长度的存储地址,以实现高效的数据存储与检索。以下是哈希函数在数据结构中的关键知识点总结&#x…...
Openssl交叉编译
在 OpenSSL 交叉编译中,linux-aarch64是一个用于指定目标平台的配置选项,表示目标是 X86 架构的 64位系统。这个选项可以从 OpenSSL 的 ./Configure 命令支持的平台列表中获取。 你可以通过运行以下命令查看 OpenSSL 支持的所有平台配置选项:…...
【linux】更换ollama的deepseek模型默认安装路径
【linux】更换ollama的deepseek模型默认安装路径 文章目录 【linux】更换ollama的deepseek模型默认安装路径Ollama 默认安装路径及模型存储路径迁移ollama模型到新的路径1.创建新的模型存储目录2.停止ollama3.迁移现有模型4.修改 Ollama 服务配置5.重启ollama6.验证迁移是否成功…...
组合模式详解(Java)
一、组合模式基本概念 1.1 定义与类型 组合模式是一种结构型设计模式,它通过将对象组织成树形结构,来表示“部分-整体”的层次关系。这种模式使得客户端可以一致地对待单个对象和组合对象,从而简化了客户端代码的复杂性。组合模式的核心在于定义了一个抽象组件角色,这个角…...
蓝桥杯单片机基础部分——单片机介绍部分
前言 这个部分是额外的,我看我有的学弟学妹基础比较差,对板子上面的模块不太熟悉,这里简单的介绍一下 蓝桥杯单片机 这个就是蓝桥杯单片机的板子,它的主控芯片是(IAP15F2K61S2),这里就对他常用…...
如何简单的去使用jconsloe 查看线程 (多线程编程篇1)
目录 前言 1.进程和线程 进程 PCB 的作用 并发编程和并行编程 线程 为什么选择多线程编程 2.在IDEA中如何简单创建一个线程 1. 通过继承Thread类 2. 通过实现 Runnable 接口 3. 使用 Lambda 表达式 3.如何简单使用jconsloe去查看创建好的线程 前言 2025来了,这是第…...
python学习笔记,python处理 Excel、Word、PPT 以及邮件自动化办公
文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python 二、处理 Excel 文件(openpyxl库)三、 处理 Word 文件(python-docx库)四、 处理 PPT 文件(python-pptx库)五、 自动发送邮件(smtplib和…...
DeepSeek教unity------Dotween
1、命名法 Tweener(补间器):一种控制某个值并对其进行动画处理的补间。 Sequence(序列):一种特殊的补间,它不直接控制某个值,而是控制其他补间并将它们作为一个组进行动画处理。 Tw…...
前端开发中关于虚拟列表的实现与应用优化
前端开发中关于虚拟列表的实现与应用优化 一、引言 在前端开发的日常工作中,我们常常会遇到需要展示大量数据列表的场景。比如电商平台的商品列表、社交平台的动态信息流等。当数据量庞大时,直接渲染所有数据会导致页面性能急剧下降,出现卡…...
图解JVM-1. JVM与Java体系结构
一、前言 在 Java 开发的广袤天地里,不少开发者都遭遇过令人头疼的状况。线上系统毫无征兆地卡死,陷入无法访问的僵局,甚至直接触发 OOM(OutOfMemoryError,内存溢出错误);面对 JVM 的 GC&#…...
Word中的文档信息域
Word中的文档信息域 DocProperty包含文档信息的多个属性, 也可以自定义属性. 查看文档预定义的自定义属性 【文件】→【信息】→【属性】→【高级属性】 参考链接 WORD中文档属性域DocProperty的应用-CSDN博客 第06套 Word_哔哩哔哩_bilibili...
Linux中的权限问题(二)
一、不受权限约束的root 按照文件的使用者进行匹配后,即使权限是“---” root依旧可以正常进行读,写,运行 二、文件拥有者和所属组的更改方法以及限制 2.1chown:更改文件拥有者以及所属组 ①可以单独修改文件拥有者 chown[更…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十八节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(ResponseOnEvent_0x86服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x86服务、事件响应、ISO 14229-1:2023、ECU测试 一、服务功能概述 0x86…...
Spring Boot自动装配:约定大于配置的魔法解密
#### 一、自动装配的哲学思考 在传统Spring应用中,开发者需要手动配置大量的XML或JavaConfig。Spring Boot通过自动装配机制实现了**约定大于配置**的设计理念,其核心思想可以概括为: 1. **智能预设**:基于类路径检测自动配置 2…...
[笔记.AI]大模型的蒸馏、剪枝、量化 | 模型压缩 | 作用与意义
上周简单整理了《deepseek-r1的不同版本(满血版、蒸馏版、量化)》,这次继续完善对其的认知——补充“剪枝”,并进一步整理蒸馏、剪枝、量化的作用与意义。 以下摘自与DeepSeek-R1在线联网版的对话 蒸馏、剪枝、量化是当前主流的三…...
【koa】05-koa+mysql实现数据库集成:连接和增删改查
前言 前面我们已经介绍了第二阶段的第1-4点内容,本篇介绍第5点内容:数据库集成(koamysql) 也是第二阶段内容的完结。 一、学习目标 在koa项目中正常连接数据库,对数据表进行增删改查的操作。 二、操作步骤 本篇文章…...
【数据结构】队列(Queue)
Queue 定义 Java中的队列(Queue)是一种先进先出(FIFO)的数据结构。队列只允许在一段进行插入数据操作,称为入队,在另一端进行删除数据操作,称为出队。我们可以把队列形象看作为排队。在最前面的进行出队,从最后面进行入队。 队列…...
机器学习PCA和LDA
主成分分析(PCA, Principal Component Analysis)和线性判别分析(LDA, Linear Discriminant Analysis)是两种常用的降维方法,它们虽然都用于数据降维,但核心思想和应用场景不同。 PCA(主成分分析…...
RocketMQ - 常见问题
RocketMQ常见问题 文章目录 RocketMQ常见问题一:消息幂等问题1:什么是消费幂等2:消息重复的场景分析2.1:发送时消息重复2.2:消费时消息重复2.3:Rebalance时消息重复 3:通用解决方案3.1ÿ…...
kafka消费能力压测:使用官方工具
背景 在之前的业务场景中,我们发现Kafka的实际消费能力远低于预期。尽管我们使用了kafka-go组件并进行了相关测试,测试情况见《kafka-go:性能测试》这篇文章。但并未能准确找出消费能力低下的原因。 我们曾怀疑这可能是由我的电脑网络带宽问题或Kafka部…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
