Hash Table,Hash Map是怎么来的?

用c++封装一个Hash Table,并与STL map 进行操作性能上的比较 阅读详情

原教程地址:https://www.youtube.com/watch?v=KyUTuwz_b7Q

Introduction

问题引入

在一个名字数组找名字Ada,需要遍历整个数组,复杂度 O(n) 。
如果我们知道Ada的索引,就可以 O(1) 直接找到Ada。
能不能构建一个函数,输入一个名字,输出得到索引?
这样要是查找一个名字,我们就可以直接算出索引,根本就不需要遍历!
在这里插入图片描述

尝试解决

我们采取这样的办法:

  • 把每个名字的每个字母的ASCII码值加起来,得到一个数值
  • 把这个数值对数组长度取模,得到一个index
  • 把这个名字放到这个数组对应的index位置上
    在这里插入图片描述

这样不管你要找什么名字,我直接通过计算就能知道它在哪里。搜索的时间复杂度是O(1)。
如果数组里存的是键值对,就类似于我们日常用的哈希表了。显然这里是把一个字符串当成了key。

Hashing Algotithm

把一个key映射到一个内存地址的算法。

  • 对于整数类型的key,可以直接通过把key的值对可用地址的数目n进行取模。
  • 对于字符串类的key,可以把每个字符的ASCII码之和对n取模。
  • 还有一类 Folding Method,把key分成等量的部分,把每个部分计算的值加起来对n取模,比如把电话号码12345678拆成 12 34 56 78。

Collision Resolution

显然有一个问题上面没有提及,如果有多个key计算出来的地址是一样的怎么办??
显然,要存的东西越多,可用的内存地址越少,越容易出现这种情况。我们用一个指标来衡量这种情况的严重性:
L o a d F a c t o r = 要 存 的 东 西 的 总 数 可 用 内 存 的 数 量 Load Factor = \frac{要存的东西的总数}{可用内存的数量} LoadFactor=可用内存的数量要存的东西的总数​
L o a d F a c t o r Load Factor LoadFactor越大,越容易出现冲突。
为了解决这个问题,出现了两类解法:

Open Addressing

叫Open是因为此类方法,每个内存地址对所有的要存的内容是开放的。也就是说,即使我发生冲突了,我可以存到别的地址上。

  • Linear Probing
    如果我发现计算得到的内容地址上已经有值了,我就去找下一个地址,直到找到空地址就存。查找时如果计算出的地址上不是我要的key,我就往下找直到找到我的key。这种方法最差的情况还是会遍历整个数组。
  • Plus 3 Rehash
    每次出现冲突,不停地找后面第三个地址有没有空位。
  • Quadratic Probing
    出现冲突,往后找失败次数的平方个位置。
  • Double Hashing
    出现冲突时,使用Second Hashing Function,得到该key下一次查找的步长。

Closed Addressing

叫Closed是因为此类方法,每个内存地址只对能通过哈希函数得到该地址的key开放。即使我发生冲突了,我也不能去占用别的地址。

  • Chaining Method
    每个数组的位置指向一个链表的头部。出现冲突时,在此处链表的尾部加上要存的内容即可。
    在这里插入图片描述

Design Hash Functions

  • 尽可能减少冲突
  • 使要存的内容尽量均匀分布在可用内存上
  • 哈希函数要尽量容易计算
  • 要能够处理冲突问题
Visual Studio 2022与Qt集成实战:解决Qt.props导入错误的完整指南 本文详细解析了在Visual Studio 2022中集成Qt开发时,如何解决因Qt.props文件导入失败导致的编译错误。文章从问题根源入手,深入剖析了Qt.props文件与QtMsBuild环境变量的关系,并提供了从检查文件存在性、配置环境变量到直接修改项目文件路径的完整排查与修复方案,帮助开发者快速恢复项目构建。 阅读详情

相关推荐

『ISOBUS 入门』第 00 节 导言:ISOBUS 的宏观图景与入门路径

ISOBUS 是由三部分构成的集成系统:两段CAN网络(拖拉机与农具侧)、标准化通信约定及认证流程。其核心在于通过统一协议实现跨品牌设备即插即用。标准体系以ISO 11783为基础,分层涵盖物理层、传输层至应用层,关键功能如虚拟终端(VT)、任务控制器(TC)和文件服务器依赖严格的会话管理与角色分工。实际部署中,总线上传输多种协议报文,故障排查需结合地址声明、多包传输与角色权限分析。学习应从真实报文入手,建立“角色—数据流—功能块”认知链,避免仅学标准或仿真替代实测,方能有效应对复杂现场问题。

linx295的博客 281

Hashtable 的实现原理

1 基本原理 我们使用一个下标范围比较大的数组,它通过一个结构体Entry来表示哈希表中的单个元素,这个结构体中有四个成员: (1)key :表示键,即哈希表中的关键字。 (2)val :表示值,即跟关键字所对应值。 (3)Entry next :指向下一个Entry,(主要用来解决冲突) (4)hash :它是一个int类型,用于表示键所对应的哈希码来存储元素 数组的Entr...

分享是最好的记忆 318

微信中调起支付宝支付

微信中调用支付宝支付,首先我们知道微信是不能直接调用支付宝的,所以我们需要使用一个中间页提示用户在浏览器中打开,然后进行网页支付或打开app支付。以下为详细唤起支付宝的步骤、业务代码以及相关页面图。 如有问题欢迎评论留言,看到定回复哦^_^\(^o^)/~ 一、微信中唤起支付宝,有几个步骤: 1、中间页引导用户在浏览器中打开去唤起支付宝。 2、浏览器中打开支付宝或app中打开支付宝。 3...

han_calligrapher的博客 2万+

hash table - hash map - 哈希表 - 散列表

hash table - hash map - 哈希表 - 散列表 In computing, a hash table (hash map) is a data structure that implements an associative array abstract data type, a structure that can map keys to values. A hash table uses a hash function to compute an index, also called

程永强 550

深入解析SSD报错“READ FPDMA QUEUED”:从诊断到修复全流程

本文深入解析了SSD报错“READ FPDMA QUEUED”的含义、成因与全流程解决方案。该错误通常指示硬盘硬件或健康状态问题。文章详细介绍了如何通过系统日志定位错误、解读关键的S.M.A.R.T.健康报告(重点关注重分配扇区计数等指标),并逐步进行硬件排查(如更换SATA数据线)、软件修复与数据抢救,最终指导用户根据诊断结果做出维修或更换SSD的决策。

weixin_29233333的博客 398

全志T113-S3 Linux系统移植实战:从硬件配置到内核启动全解析

本文详细解析了将Linux系统移植到全志T113-S3嵌入式芯片的完整实战流程。内容涵盖从开发环境搭建、Longan SDK源码获取,到关键的U-Boot配置、DDR初始化、Linux内核编译与设备树定制,以及根文件系统构建与启动脚本分析。文章结合硬件配置与启动日志解读,提供了从硬件配置到内核启动的全方位指导,帮助开发者高效完成系统移植。

ik67890123的博客 514

Map、Dictionary、Hash Table:到底该用哪一个?

Map、Dictionary、Hash Table:到底该用哪一个?

ttod的博客 889

ArduPilot 的 RTOS 选择:为何 ChibiOS 成为现代飞控的首选

本文深入探讨了ArduPilot选择ChibiOS作为现代飞控首选RTOS的原因。通过对比FreeRTOS和NuttX,ChibiOS凭借其50ns中断响应、1.2μs上下文切换时间和高效的资源管理脱颖而出,特别适合处理无人机飞控中的高频传感器融合和实时控制任务。文章还详细分析了ChibiOS在STM32硬件上的优化实践及其在无人机开发中的显著优势。

weixin_29161719的博客 568

hash table - hash map - 哈希表 - 散列表 - C

hash table - hash map - 哈希表 - 散列表 - C hash:散列,杂凑,哈希 hash table,hash map:哈希表,散列表 hash function:哈希函数,散列函数 key-value pair,KVP:键值对 key:键 hash:散列值 value:值 collision [kə'lɪʒ(ə)n]:n. 抵触,碰撞 (或相撞) 事故 Hash Table is a data structure which stores data in an associati

程永强 713

stm32H743IIT6 cubemx HAL USB UVC摄像头基础

stm32性能已经很强了, 可以驱动ov5640摄像头, 所以可以把摄像头接在stm32上, 当作一个摄像头驱动器, 连接到电脑上 开发环境: stm32cubemx 6.0.1 单片机: 自己做的stm32h743iit6核心板,兼容正点原子 学习资料: 圈圈学USB 鱼鹰谈单片机 从零开始学习USBhttps://to-run-away.blog.youkuaiyun.com/article/details/85038393 整个项目是基于CDC串口上修改 1 stm32 USB 代码概览 ..

紫枫洛天的博客 7750

高速PCB设计中的一些常用规则

目前,高速PCB产品设计中,高速接口的应用日益普及,对于复杂的设计而言,高速走线就如同“蜘蛛网”一样密布在PCB各处,因此,在进行PCB检查及评审时,必要的高速PCB设计经验法则及规则是工程师开展工作必不可少的知识储备。

一只豌豆象的博客 3414

hash table - hash map - 哈希表 - 散列表 - Java

hash table - hash map - 哈希表 - 散列表 - Java hash:散列,杂凑,哈希 hash table,hash map:哈希表,散列表 hash function:哈希函数,散列函数 key-value pair,KVP:键值对 如果所有的键 (key) 都是数值较小的整数,我们可以用一个数组来实现无序的符号表,将键作为数组的索引而数组中键 iii 处储存的就是它对应的值 (value)。这样我们就可以快速访问任意键 (key) 的值 (value)。散列表使用这种简易方法的

程永强 672

Nova — GPU/vGPU 虚拟机

目录 文章目录目录云主机使用显卡的实现方式虚拟显卡物理显卡直通物理显卡虚拟化 云主机使用显卡的实现方式 采用虚拟显卡 采用物理显卡直通 采用物理显卡虚拟化 虚拟显卡 虚拟显卡技术,主要用于虚拟机 Remote Console 领域,如:VNC(Virtual Network Computing,虚拟网络计算机),它能将完整的窗口界面通过网络,传输到另一台计算机的屏幕上。 VNC 主要由 VNC server 和 VNC viewer 两部分组成。用户需先将 VNC server 安装在被远程操控的计算

烟云的计算 2426

一篇足矣,带你吃透STL源码中hash table(哈希表)与关联式容器hash_set、hash_map

前面介绍的二叉搜索树和平衡二叉搜索树。二叉搜索树具有对数平均时间的表现,但这样的表现构造在一个假设上:输入数据有足够的随机性 文本要介绍一种名为hash table(哈希表/散列表)的数据结构,这种结构在插入、删除、搜索等操作上也具有“常数平均时间”的表现,而且这种表现是以统计为基础,不需依赖输入元素的随机性 哈希表可以在本人的数据结构文章中查看,文本就不再详细介绍了:https://blog...

董哥的黑板报 3499

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

STL源码——hash table(哈希表)与关联式容器hash_set、hash_map★★★

一、哈希介绍 前面介绍的二叉搜索树和平衡二叉搜索树。二叉搜索树具有对数平均时间的表现,但这样的表现构造在一个假设上:输入数据有足够的随机性 文本要介绍一种名为hash table(哈希表/散列表)的数据结构,这种结构在插入、删除、搜索等操作上也具有“常数平均时间”的表现,而且这种表现是以统计为基础,不需依赖输入元素的随机性 哈希表可以在本人的数据结构文章中查看,文本就不再详细介绍了:hash table是作为hash_set、hash_map、hash_multiset、hash_multimap容器的底

一蓑烟雨任平生 435

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

c++哈希表hash_table的深度学习(hash_map,un和hash_set的底层实现)

哈希表(Hash Table)是一种数据结构,它使用哈希函数将键(key)映射到桶(bucket)或槽(slot)中,可以直接通过相应的键值直接对数据进行访问,高效的插入,删除,查找。

weixin_72492465的博客 1749

Go Map进化史:从桶链式哈希表到Swiss Table的源码级剖析

在Go语言中,是我们最常用的数据结构之一,但你是否想过,当你写下时,底层究竟发生了什么?Golang的Map经历了两次重大变革,每一次都代表着哈希表技术的进步,本文将通过源码级分析,对比Go Map的两种实现,揭示其设计哲学和性能优化秘诀Go的其实是go的一个语法糖,在编译器编译的时候,会把赋值这个操作转化成和这两个方法,这两个方法是在go sdk的compile包里面定义的// ...可以看到,

ComingLiu的博客 905

C++STL之hash_table,hash_map与hash_multimap,hash_set与hash_multiset的使用

hash_table是STL中hash_map 和 hash_set 的内部数据结构,hash_table的插入 / 删除 / 查找的时间复杂度都为O(1), 是查找速度最快的一种数据结构,但是hash_table中的数据是无序的,一般也只有在数据不需要排序, 只需要满足快速查找 / 插入 / 删除的时候使用hash_table。hash_table的扩展是将原hash_table中的数据摘下来插...

Alexander的博客 1584

[CareerCup] 13.2 Compare Hash Table and STL Map 比较哈希表和Map

  13.2 Compare and contrast a hash table and an STL map. How is a hash table implemented? If the number of inputs is small, which data structure options can be used instead of a hash table?   这道题让我...

weixin_33739541的博客 128

HDU - 6768 The Oculus(哈希)

传送门 看到斐波那契数列,以为是矩阵或者公式那种题,但是本题给出的位数太大,一时间没想到怎么写,赛后题解说是哈希才恍然大悟,看来还是自己对哈希不太熟练(还有一个重要原因是这个复杂度遍历竟然不超时,这是无论如何都想不到的) 正解: 令修改的那一位为kkk,则要找到这个kkk满足 A×B=C+F(k)A×B = C+F(k)A×B=C+F(k),因为斐波那契数列第几十项以后就爆long  long long~~long~long  long 了,那么

Happig的博客 311

数据结构(55) 散列表(哈希表,hash table,hash map)

目录 1、散列表的基本概念 2、散列函数的构造方法 3、常用的散列函数 3.1、直接定址法 3.2、除留余数法 3.3、数字分析法 3.4、平方取中法 4、处理冲突的办法 4.1、开放定址法 4.2、拉链法(链接法,chaining) 5、散列表查找 6、散列表的查找过程的性能分析 1、散列表的基本概念 在前面介绍的线性表和树表的查找中,记录在表中的位置和记录的关键字之间不存在确定关系,因此,在这些表中查找记录时需进行一些列的关键字比较。这类查找方法建立在“比较”的基础上,查找的

李白 2284

Tenlink TM1200上云PLC详解:从Modbus到MQTT的设备数据采集与边缘计算

工业设备数据上云的第一步,往往卡在如何把PLC、传感器、变频器等现场设备的运行数据安全、稳定地送到云端。Modbus RTU/TCP和OPC UA是打通设备侧的两大主流协议,前者通过寄存器地址直接读取数据,后者以节点订阅方式屏蔽地址差异;而MQTT则承担了上云通道的重任,配合断线缓存和补传机制保障链路可靠。边缘计算网关的兴起,将协议解析、数据采集、上云推送集成到一个盒子中,极大降低了工程师的调试门槛,让数控机床、冷库监控、变频器联动等场景能快速实现设备联网。Tenlink TM1200正是这类一体化上云终端

weixin_30824479的博客 377

hash_table和STL map

SOLUTION Compare and contrast Hash Table vs. STL map 在hash_table中value通过使用哈希函数产生的关键字来存储。因此在hash table中值不是以有序的方式来存储。此外,由于使用key找到下标来存储value,所以插入和查找能够在O(1)时间内完成。在hashtable中必须处理潜在的冲突。 In a hash table,

f81892461的专栏 1685

[算法]hash table 与 hash map 实现

通过一个哈希函数建立值与存储位置的一个对应关系,在寻找该值时,可以直接通过该函数计算得出其存储位置,而不需要像其它数据结构一样通过比较来查找。理想情况下查找的时间复杂度为o(1)。哈希函数的构造方法有很多种,一个好的哈希函数应该让数据地址平均分布,并且避免冲突。此处通过除留余数法来构造哈希函数:key = value % p (p不大于哈希表长度) 哈希表的长度应远大于数据存储量。当存储量接近哈...

weixin_30505751的博客 107

Hash Map和 Hash Table的区别?

目录 Hash Map: Hash Table: 区别: 1、继承的父类不同 2.内部实现使用的数组初始化和扩容方式不同 3.底层不同 而HashMap什么时候使用红黑树呢? 4.线程的安全性 Hash Map: HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。 HashMap 是无序的,即不会记录插入

jchsadasd的博客 2307

Swiss Table 哈希表实现与常规 Map 实现的性能对比分析

Swiss Table 通过多种优化手段,在内存使用、扩容机制、操作优化和哈希冲突处理等方面相较于常规 Map 实现具有明显优势,特别是在高负载情况下,能够提供更高的性能和更好的扩展性。Swiss Table 通过将64位的哈希值分成两部分——H1和H2,H1用于确定元素在表中的索引,而H2用于存储元数据,这样可以减少哈希冲突,提高查找效率。在元素数量超过负载因子与数组长度的乘积时,会触发扩容操作,将数组容量扩展为原来的2倍,这个过程涉及到重新计算所有元素的哈希值并重新分配,可能会导致短暂的性能下降。

进击的Blazor 931
上一篇: 《The C Programming Language》 第一章总结
下一篇: 【文章阅读】Fuzzing JavaScript Engines with Aspect-preserving Mutation(S&P 2020)
Instein98
博客等级 码龄9年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值