当前位置: 首页 > news >正文

代码随想录笔记——哈希表

定义

也叫散列表,哈希表是一种“通过 key 快速找到 value 的数据结构思想”,并不是一种新的数据结构。

用key访问对应的value

特点

  • 可以O(1)的时间复杂度进行元素查询、添加、删除
  • 牺牲空间换取时间:哈希表中有一部分空间是浪费的。

什么时候用

当遇到要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。

基本操作

初始化、查询操作、添加键值对和删除键值对等,在python中用字典实现:

hmap:dict={}hmap['a']=1hmap['b']=2#查询n=hmap['a']#删除hmap.pop('a')#三种遍历#遍历键值对forkey,valueinhmap.items():#遍历keyforkeyinhmap.keys():#遍历valueforvalueinhmap.values():

哈希函数

将key转换为更规范的数组索引(相当于对key归一化)

  • 输入key, 输出index
  • 常见哈希函数:对数组长度取余(对应用数组实现哈希表的情况,比如数组(list)的长度是20,现在有20个键值对,我们想让数组的元素就是键值对的值,为了让key直接索引到对应的value,需要把key归一化为数组的索引:0到19)
  • 哈希函数的特点:输入空间大于输出空间。以数组型哈希表为例,输出的是数组索引,0-len(nums)-1,但是key的范围是无限的。这也引出的了哈希函数的关键问题——哈希冲突

哈希冲突

当哈希函数的多个输入对应一个输出时(多对一),存在索引冲突。
简单粗暴的解决方式是直接扩容输出空间的范围,比如用,但效率低。

相关概念:负载因子
定义为哈希表中元素数量除以桶数量,反映了哈希冲突的严重程度,常用作触发哈希表扩容的条件

哈希表的结构改良方法主要包括链式地址开放寻址

链式地址

本来一个位置只能存一个键值对(元素),当多个元素指向一个索引时,可用链表将他们连起来,设置其中一个为头结点,将所有发生冲突的键值对都存储在同一链表中。

操作
  • 查询:key先根据哈希函数找到这个索引——找到链表的头结点,然后进入链表,当key与链表中某一个pair.key相等时,就找了对应的value
  • 删减:遵循链表的删减规则
缺点
  • 占用空间增大:链表包含节点指针,它相比数组更加耗费内存空间。
  • 查询效率降低:因为需要线性遍历链表来查找对应元素。

开放寻址

1. 线性检测
  • 当插入键值对时发现index的对应位置已有了其他键值对,便从当前索引开始,继续向后依次寻找位置,直到发现某个index位置是空的,把pari插入进去。
  • 如何查询:当发现key由哈希函数映射的index对应的pair.key不是当前的key,从这个位置开始,逐个对比pair.key,直到找到自己。
缺点:
  • 有聚集效应
  • 无法删除起冲突的键值对(所有开放选址的共性问题),比如由两个index内的pair的key是相同的,如果删除index = hash_function(key)那个位置的,那么它的位置就是None,之后如果需要查找另一个pair,当发现了第一个index的位置的none,就不会再继续遍历了,会认为这个哈希表里没有需要的pair。
  • 解决方法是需要删除时,把None替换成TOMBSTONE,当被检测到这个字符时,还可以继续查询。
  • 同时为了避免一个哈希表前面的TOMBSTONE过多,发现一个就把它和目标pair的位置互换一下,提高查找效率。
2. 平方检测
  • 减缓聚集效应
    线性检测是从冲突的位置之后逐一检测空位情况,index+1,index+2,index+3…
    平方检测是从冲突位置开始,跳过“探测次数的平方”的步数,index+1,index+4,index+9…
3. 多次哈希

使用不止一个哈希函数,当一个映射冲突时,就换另一个

不同的语言解决哈希冲突的方式不同,Python 的 Dict 采用开放寻址

说明

上述解决哈希冲突的思路(链式地址,开放选址)是“出现哈希冲突时仍能正常工作”。但是这些解决方式会提高哈希表查询的复杂度,如果冲突严重,查询的复杂度可能从O(1)变为O(n)

哈希算法

  • 哈希算法指的就是哈希函数,解决哈希冲突的另一个想法。哈希算法的思路是通过设计哈希函数,使其尽可能避免冲突(多对一的映射),通过哈希函数让键值对在哈希表中的分布更均匀

  • 常见哈希算法:一般使用一些标准哈希算法,如 MD5、SHA-1、SHA-2 和 SHA-3 等

  • 不同的编程语言有其内置哈希算法,python可以调用hash()函数来计算各种数据类型的哈希值

http://www.zskr.cn/news/1311496.html

相关文章:

  • AGV物流机器人电池:循环寿命突破3500次、高精度BMS定制 - 新闻快传
  • Claude Code 技能系统全解析:AI Agent 自定义能力、SKILL.md、MCP 扩展、上下文预算与企业级自动化落地
  • 卡片刷新三板斧:定时、定点、主动请求——搞清楚才不会乱
  • GTA5线上小助手:免费开源工具让你的游戏体验全面升级
  • 别再手动刷苹果了!用Blender 3.6的镂版映射,5分钟搞定写实苹果纹理
  • TVA动态阈值实时稳定方案
  • LSTM加速宇宙学模拟:SageNet框架解析与应用
  • Python技能安装器设计:从虚拟环境到CLI的自动化部署实践
  • 论文AI痕迹重、大面积飘红?从68%到0%:3大工具测评与结构级优化教程
  • AI Agent接管你电脑前,必须关闭的6个系统安全开关,否则面临RCE风险(CVE-2024-XXXX已验证)
  • 5步轻松上手:Grasscutter命令生成器实用指南
  • 书匠策AI降重降AIGC全拆解:http://www.shujiangce.com 这个“论文急救站“到底靠不靠谱?
  • Cursor AI插件深度解析:从自动化脚本到智能编程工作流
  • ATCC病毒生产厂家与进口代理商怎么选?质量、售后、价格三维对比指南 - 品牌推荐大师
  • 2026年4月行业内评价高的不锈钢法兰厂商推荐,变压器法兰/不锈钢法兰/高温合金法兰,不锈钢法兰生产厂家哪家权威 - 品牌推荐师
  • 2026年4月工业纸箱联动线公司推荐,纸箱粘钉联动线/工业纸箱联动线,工业纸箱联动线制造厂家口碑推荐 - 品牌推荐师
  • Pearcleaner:你的macOS数字管家,彻底告别应用残留的终极清理方案
  • 论文AI率超标怎么办?实测3款高性价比降AIGC工具(附综合对比)
  • 微信好友检测终极指南:快速发现谁删除了你的免费解决方案
  • 2026年松江区交通事故纠纷律所评测:四家机构核心能力对比 - 奔跑123
  • # 2025-2026-2 《Python程序设计》实验四报告
  • 苹果砂不锈钢蜂窝板做出来真的和苹果店一样吗?来自广东优之彩!
  • Taotoken的APIKey管理与审计日志如何助力企业合规
  • 东北区域主流草坪基地品牌实测排行与采购参考 - 奔跑123
  • 使用标准库例程串口乱码
  • Arm DynamIQ DSU L3缓存电源管理技术解析
  • linux ubuntu 挂载硬盘
  • 涿州本地防盗门品牌实测评测:安全与服务双维度对比 - 奔跑123
  • 3分钟彻底告别Windows资源管理器窗口混乱:QTTabBar终极标签页解决方案
  • 书匠策AI官网www.shujiangce.com|别再死磕“洗稿式降重“了!这才是2025论文通关的正确姿势