数据结构:哈希

哈希函数的概念:哈希函数是哈希表(散列表)的核心组件,其作用是将任意长度的键(Key)映射为固定长度的存储地址,以实现高效的数据存储与检索。以下是哈希函数在数据结构中的关键知识点总结:

一、哈希函数的核心作用

  1. 快速定位数据
    通过哈希函数计算键的哈希值,直接定位到数组中的存储位置,使得插入、删除和查找操作的平均时间复杂度为 O(1)
  2. 冲突管理
    不同键可能映射到相同地址(哈希冲突),哈希函数的设计需尽可能减少冲突概率,并通过冲突解决策略处理实际冲突。

二、常见哈希函数构造方法

  1. 直接定址法
    • 公式:H(key) = a*key + b
    • 特点:适用于键分布连续的场景(如年龄存储),无冲突但空间利用率低。
    • 示例:年龄为键时,直接以年龄作为数组下标。
  2. 除留余数法
    • 公式:H(key) = key % p(p为不大于表长的质数)
    • 特点:简单高效,需选择合适质数以减少冲突。
    • 示例:当表长m=10,选择p=7,键12的哈希值为12%7=5。
  3. 平方取中法
    • 步骤:对关键字平方后取中间几位作为哈希值。
    • 适用场景:关键字分布范围大且中间位数较均匀。
  4. 折叠法
    • 方法:将关键字分割为多段后叠加求和(如移位叠加或间界叠加)。
    • 适用场景:长关键字且位数分布均匀。
  5. 随机数法
    • 公式:H(key) = random(key)
    • 特点:适用于非数值型键,需保证随机性以减少冲突。

三、哈希冲突的解决方案:

一、开放地址法(Open Addressing)

核心思想:当发生冲突时,按规则探测哈希表中的下一个空槽位。
探测方式

  1. 线性探测:按顺序向后逐个查找空位。
    • 公式: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。
  2. 二次探测:按平方增量跳跃式探测。
    • 公式:d_i = ±1², ±2², ..., ±k²
    • 示例
      若 H(key)=3 冲突,探测顺序为 3+1²=4 → 3-1²=2(若2为空则插入)。
  3. 伪随机探测:通过伪随机数生成增量序列。
    • 示例
      若哈希表长度 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]

  • 查找时先查主表,未找到则遍历溢出区。

五.方法对比:

方法优点缺点
开放地址法空间紧凑,无需额外结构易产生聚集,删除复杂
链地址法无聚集,支持动态插入/删除需额外存储指针,空间开销大
再哈希法冲突概率低计算时间增加
公共溢出区法实现简单,适合冲突较少场景溢出区过大时效率下降

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

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

相关文章

图解JVM-1. JVM与Java体系结构

一、前言 在 Java 开发的广袤天地里,不少开发者都遭遇过令人头疼的状况。线上系统毫无征兆地卡死,陷入无法访问的僵局,甚至直接触发 OOM(OutOfMemoryError,内存溢出错误);面对 JVM 的 GC&#…

深入浅出 Python Logging:从基础到进阶日志管理

在 Python 开发过程中,日志(Logging)是不可或缺的调试和监控工具。合理的日志管理不仅能帮助开发者快速定位问题,还能提供丰富的数据支持,让应用更具可观测性。本文将带你全面了解 Python logging 模块,涵盖…

设计模式15:中介者模式

系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 1.概述 中介者模式(Mediator Pattern)是一种行为设计模式,旨在通过一个中介对象来封装一系列对象之间的交互方式,从而减少这些对象间的直接依赖。在该模式…

爬取网站内容转为markdown 和 html(通常模式)

我们遇到一些自己喜欢内容,想保存下来,手动复制粘贴很麻烦,我们使用 python 来爬取这些内容。 一、代码 downlod.py import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin# 目标网页(可…

【Linux】命令操作、打jar包、项目部署

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:Xshell下载 1:镜像设置 二:阿里云设置镜像Ubuntu 三&#xf…

Unity合批处理优化内存序列帧播放动画

Unity合批处理序列帧优化内存 介绍图片导入到Unity中的处理Unity中图片设置处理Unity中图片裁剪 创建序列帧动画总结 介绍 这里是针对Unity序列帧动画的优化内容,将多个图片合批处理然后为了降低Unity的内存占用,但是相对的质量也会稍微降低。可自行进行…

day4 多连联表慢查询sql查询优化

1.Explain分析sql语句出现的字段是什么意思 id: 查询的序列号,表示查询中 select 子句或操作表的顺序。 如果 id 相同,则执行顺序从上到下。 如果 id 不同,如果是子查询,id 的值会递增,id 值越大优先级越高&#xff0c…

基于豆瓣2025电影数据可视化分析系统的设计与实现

✔️本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示,构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据,我们提供了一个全面的电影信息平台,为用户提供深入了解电影产业趋势、影片评价与演员表现的工…

力扣高频sql 50题(基础版) :NULL, 表连接,子查询,case when和avg的结合

NULL的处理 nvl(字段,num) 和数字进行比较需要先使用nvl(字段,num)函数处理空值 思路: 没有被id 2 的客户推荐>> 过滤条件 referee_id !2 没有被id 2 的客户推荐>>被其他客户推荐, 但是也有可能没有被任何客户推荐>>NULL 考点: NULL是 不一个具体的数…

夜莺监控发布 v8.beta5 版本,优化 UI,新增接口认证方式便于鉴权

以防读者不了解夜莺,开头先做个介绍: 夜莺监控,英文名字 Nightingale,是一款侧重告警的监控类开源项目。类似 Grafana 的数据源集成方式,夜莺也是对接多种既有的数据源,不过 Grafana 侧重在可视化&#xff…

Python - 爬虫利器 - BeautifulSoup4常用 API

文章目录 前言BeautifulSoup4 简介主要特点:安装方式: 常用 API1. 创建 BeautifulSoup 对象2. 查找标签find(): 返回匹配的第一个元素find_all(): 返回所有匹配的元素列表select_one() & select(): CSS 选择器 3. 访问标签内容text 属性: 获取标签内纯文本get_t…

认识 ADB(Android Debug Bridge,Android SDK 中的一个工具)

一、ADB 概述 ADB,全称 Android Debug Bridge,是 Android SDK 中的一个工具 ADB 位于 Android SDK 下 platform-tools 目录中 ADB 起到调试桥的作用,ADB 可以让开发者通过 USB 连接安卓设备,并在电脑上执行各种命令,…

模拟解决哈希表冲突

目录 解决哈希表冲突原理: 模拟解决哈希表冲突代码: 负载因子: 动态扩容: 总结: HashMap和HashSet的总结: 解决哈希表冲突原理: 黑色代表一个数组,当 出现哈希冲突时&#xff0…

FPGA简介|结构、组成和应用

Field Programmable Gate Arrays(FPGA,现场可编程逻辑门阵列),是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物, 是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的&#xff0c…

【机器学习】超参数调优指南:交叉验证,网格搜索,混淆矩阵——基于鸢尾花与数字识别案例的深度解析

一、前言:为何要学交叉验证与网格搜索? 大家好!在机器学习的道路上,我们经常面临一个难题:模型调参。比如在 KNN 算法中,选择多少个邻居(n_neighbors)直接影响预测效果。 • 蛮力猜…

UGUI RectTransform的SizeDelta属性

根据已知内容,SizeDelta offsetMax - offsetMin 1.锚点聚拢情况下 输出 那么此时SizeDelta就是UI元素的长宽大小 2. 锚点分散时 引用自此篇文章中的描述 揭秘!anchoredPosition的几何意义! SizeDelta offsetMax - offsetMin (rectMax…

51单片机入门_10_数码管动态显示(数字的使用;简单动态显示;指定值的数码管动态显示)

接上篇的数码管静态显示,以下是接上篇介绍到的动态显示的原理。 动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选&#xff…

mybatis使用typeHandler实现类型转换

使用mybatis作为操作数据库的orm框架,操作基本数据类型时可以通过内置的类型处理器完成java数据类型和数据库类型的转换,但是对于扩展的数据类型要实现与数据库类型的转换就需要自定义类型转换器完成,比如某个实体类型存储到数据库&#xff0…

瑞萨RA-T系列芯片ADCGPT功能模块的配合使用

在马达或电源工程中,往往需要采集多路AD信号,且这些信号的优先级和采样时机不相同。本篇介绍在使用RA-T系列芯片建立马达或电源工程时,如何根据需求来设置主要功能模块ADC&GPT,包括采样通道打包和分组,GPT触发启动…

最新智能优化算法:牛优化( Ox Optimizer,OX)算法求解经典23个函数测试集,MATLAB代码

一、牛优化算法 牛优化( OX Optimizer,OX)算法由 AhmadK.AlHwaitat 与 andHussamN.Fakhouri于2024年提出,该算法的设计灵感来源于公牛的行为特性。公牛以其巨大的力量而闻名,能够承载沉重的负担并进行远距离运输。这种…