第六章——哈希表

小结

‧「哈希表hashtable」,又称「散列表」,其通过建立键Key与值 value 之间的映射,实现高效的元素查询。哈希表的目标是将一个较大的状态空间映射到一个较小的空间,并提供𝑂(1)的查询效率。

‧输入key,哈希表能够在𝑂(1)时间内查询到value,效率非常高。

‧常见的哈希表操作包括查询、添加键值对、删除键值对和遍历哈希表等。

元素查询效率对比:

 ‧ 哈希函数将key映射为数组索引,从而访问对应桶并获取value 。

‧ 两个不同的key可能在经过哈希函数后得到相同的数组索引,导致查询结果出错,这种现象被称为哈希冲突。本质上看,哈希函数的作用是将所有key 构成的输入空间映射到数组所有索引构成的输出空间,而输入空间往往远大于输出空间。因此,理论上一定存在“多个输入对应相同输出”的情况。

‧ 哈希表容量越大,哈希冲突的概率就越低。哈希函数的最后一步往往是对数组长度𝑛取余,让输出值落入在数组索引范围;在扩容后,数组长度𝑛发生变化,而 key 对应的索引也可能发生变化。原先落在同一个桶的多个Key扩容后可能会被分配到多个桶中,从而实现哈希冲突的缓解。与数组扩容类似,哈希表扩容操作的开销很大。

‧ 负载因子定义为哈希表中元素数量除以桶数量,反映了哈希冲突的严重程度,计算公式为元素数量‌与‌桶(槽位)数量‌的比值,该指标用于量化哈希表的填充程度。例如,若哈希表有10个桶且存储了7个元素,则负载因子为0.7 。常用作触发哈希表扩容的条件。

‧ 链式地址通过将单个元素转化为链表,将所有冲突元素存储在同一个链表中。然而,链表过长会降低查询效率,可以进一步将链表转换为红黑树来提高效率。

‧ 开放寻址通过多次探测来处理哈希冲突。线性探测使用固定步长,缺点是不能删除元素,且容易产生聚集。多次哈希使用多个哈希函数进行探测,相较线性探测更不易产生聚集,但多个哈希函数增加了计算量。

‧ 不同编程语言采取了不同的哈希表实现。例如,Java的 HashMap 使用链式地址,而Python的 Dict 采用开放寻址。

‧ 在哈希表中,我们希望哈希算法具有确定性、高效率和均匀分布的特点。在密码学中,哈希算法还应该具备抗碰撞性和雪崩效应。

‧ 哈希算法通常采用大质数作为模数,尽可能消除周期性模式,以最大化地保证哈希值的均匀分布,减少哈希冲突。

‧ 常见的哈希算法包括MD5、SHA‑1、SHA‑2和SHA3等。MD5常用于校验文件完整性,SHA‑2常用于安全应用与协议。

‧ 编程语言通常会为数据类型提供内置哈希算法,用于计算哈希表中的桶索引。通常情况下,只有不可变对象是可哈希的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿梭的编织者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值