哈希表深度解析

目录

一、引言

二、哈希表的基本概念:不是 “存数据”,是 “给数据找位置”

三、哈希冲突

3.1 开放定址法:冲突了?换个空位置放

3.1.1 线性探测:一步一步往后找

3.1.2 二次探测:跳着找,减少扎堆

3.2 链地址法:冲突了?挤在同一个位置的 “链表” 里

四、动态扩容与负载因子

4.1 负载因子

4.2 扩容

五、结语



一、引言

如果你用过手机里的联系人列表,一定有过这样的体验:想找 “张三” 的电话,不需要从 “A” 开头的名字一个个往下翻,直接在搜索框输入 “张三”,瞬间就能定位到他的联系方式 —— 这个 “秒查” 的背后,其实藏着一种高效的数据管理思路:通过一个 “关键词”(比如名字),直接找到目标信息的位置,不用逐个排查。

而在编程世界里,我们同样会遇到类似的需求:

1)记录学生的学号与成绩。

2)存储用户的账号与密码。

3)统计一篇文章里每个单词出现的次数。

如果用数组,想找某个元素得从头遍历,数据越多越慢;用链表,虽然插入删除方便,但查找效率依旧不尽如人意。有没有一种数据结构,能像查联系人那样,通过一个 “关键词” 直接 “跳” 到目标数据的位置,实现近乎 “瞬间查找” 的效果?

答案就是哈希表(Hash Table)。它既不是数组的 “升级版”,也不是链表的 “替代品”,而是一种把 “关键词” 和 “数据位置” 直接关联的聪明设计 —— 就像给每个数据都分配了一个 “专属门牌号”,只要知道门牌号(通过关键词计算得出),就能一步找到家。

接下来,我们就从哈希表的基本概念说起,聊聊它是怎么实现 “秒查” 的,遇到 “多个数据抢一个门牌号”(哈希冲突)时该怎么解决,以及数据存满了之后它如何 “扩容”。本文侧重点在于底层的原理,至于STL中的哈希表如何使用,这里就不做介绍了,可以在C++官网进行学习使用。

二、哈希表的基本概念:不是 “存数据”,是 “给数据找位置”

要理解哈希表,首先要跳出 “序列式容器” 的思维 —— 数组、链表、队列等序列式容器,是按 “插入顺序” 存储数据,访问时需按 “位置”(如下标、节点顺序)查找;而哈希表是关联式容器,核心是 “通过关键词(Key)关联数据(Value)”,存储和访问的逻辑都围绕 “Key” 展开。

以 STL 中的unordered_map为例,它的核心存储单元是<Key, Value>键值对,比如<学号"2024001", 成绩95>。哈希表的工作逻辑分两步:

  1. 算 “门牌号”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值