数据结构:哈希
哈希函数的概念:哈希函数是哈希表(散列表)的核心组件,其作用是将任意长度的键(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部…...
百能云板6层埋铜块PCB:高功率场景下的热管理与载流性能标杆方案
在新能源汽车、工业IGBT、高算力服务器等高功率密度应用场景中,PCB的热管理能力、载流性能与长期可靠性,直接决定了系统的稳定性与使用寿命。百能云板推出的6层埋铜块PCB,依托一体化埋铜工艺、高阶HDI结构及高稳定性基材,构建了集…...
置顶必读(1) | 《YOLOv12实战:从入门到深度优化》专栏导读与完整目录导航(持续更新中)
🏆 本文收录于 《YOLOv12实战:从入门到深度优化》 专栏。 本专栏系统梳理并持续复现 YOLOv12 官方特性、Attention-Centric 架构、R-ELAN、Area Attention 等核心创新,内容坚持 严格贴合官方文档 深度原理拆解 工程落地导向,不仅…...
用了4款免费AI编程工具后,发现大多数人都选错了——附2026年最全避坑指南
AI Coding工具选型指南2026:GitHub Copilot Free / Cursor / Trae / Qwen Code 全维度横评与避坑实录 一、工具分类前置说明 在比较具体功能之前,必须明确工具形态差异。主流AI编程工具分别以"AI原生IDE"、"IDE插件集成"和"终端Agent"三种不…...
怎样高效使用开源工具KeymouseGo:3种实用技巧与实战方案告别重复工作
怎样高效使用开源工具KeymouseGo:3种实用技巧与实战方案告别重复工作 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo…...
Python新手必看:别再被‘FileNotFoundError‘坑了,手把手教你用os.path.exists()检查文件是否存在
Python文件操作避坑指南:从防御性编程到路径管理实战 刚接触Python文件操作时,最让人抓狂的莫过于满屏的FileNotFoundError。明明代码逻辑没问题,文件也确实存在,为什么Python就是找不到?这背后往往隐藏着路径规范、系…...
AI 学习笔记:Agent 的能力体系
Qt是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本笔记将重点介绍QSpinBox数值微调组件的常用方法及灵活应用。…...
2026届必备的六大AI科研方案推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 计算机智能技术于毕业论文撰写当中的运用,正渐渐演变成学术范围里的关键辅助手段…...
git-recall 与团队协作:如何高效监控团队成员的工作进展
git-recall 与团队协作:如何高效监控团队成员的工作进展 【免费下载链接】git-recall An interactive way to peruse your git history from the terminal 项目地址: https://gitcode.com/gh_mirrors/gi/git-recall 在团队开发中,及时了解成员的…...
ClickClaw:一键部署AI智能体,告别命令行,实现开箱即用
1. 项目概述:从命令行到点击即用的AI助手革命 如果你对AI智能体(Agent)感兴趣,肯定听说过OpenClaw。它是一个功能强大的开源AI助手框架,能让你创建自己的“贾维斯”,通过飞书、微信、Telegram等渠道与AI对话…...
基于Supabase与pgvector构建企业级RAG智能问答系统实战
1. 项目概述:从零构建一个基于文档的智能问答系统 最近在做一个很有意思的尝试:如何快速地把一堆静态文档(比如公司内部Wiki、产品手册、个人笔记)变成一个能“对话”的智能助手?想象一下,你上传一份产品说…...
