C++哈希表

本文介绍了C++中哈希表的槽总数选择,针对关键码范围较小和较大时的不同策略。讨论了简单的哈希函数,如取模和平方取中,并探讨了字符串哈希函数。冲突解决策略包括开哈希法(单链表)和闭哈希法(开放地址),以及桶式哈希、线性探查和解决聚集的方法,如二次探查和双哈希。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

槽总数的选择

关键码范围较小

由于关键码范围比较小,可以使用一个槽总数大于关键码总数的表。直接使用槽的下标作为关键码值,此时,不需要将关键码值作为记录的一部分进行存储。哈希函数可以直接设计成h(K)=K,但是这种情况比较少见

##关键码范围较大
如果可能的关键码范围较大,而同一时间段内存储的记录总数较少时。如果槽数的设计和前者匹配通常意味着空间的浪费,而如果和后者匹配又容易导致冲突
除此之外,如果对关键码值的分布特性不了解,也会使得哈希函数的设计更为困难。如果了解关键码值的分布特性,应对使用一个依赖于分布的哈希函数,避免把一组相关的关键码值映射到表的同一个槽中(例如,如果对英文单词进行哈希,就不应当对第一个字符的值哈希,因为这样很可能使分布不均)

简单的哈希函数

关键码为数值的哈希函数的设计:
**1.取模:**哈希函数的返回值(槽的位置)只依赖于关键码的最低几位,由于这些位的分布可能很差,结果分布也就可能很差
**2.平方取中:**一个很好的用于数值的哈希函数。对于长度为2^r的表,取出平方后结果的中间r位作为槽的位置。由于关键码值的大多数位或者所有位都对结果有所贡献,所有效果很好
关键码为字符串的哈希函数的设计:
3.所有字母ASCII值求和对M取模

冲突解决策略

尽管哈希函数的目标是使冲突最少,但实际上冲突是无法避免的。冲突解决技术可以分为两类:
•开哈希(单链表)法
•闭哈希(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

源代码大师

赏点狗粮吧

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

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

打赏作者

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

抵扣说明:

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

余额充值