C++数据结构之哈希表

本文介绍了哈希表的概念,包括其作为快速查找数据结构的工作原理,哈希函数的作用以及哈希冲突的解决方法。特别提到了C++ STL中的unordered_map结构,它是基于哈希表实现的,提供了O(1)的平均查询和插入效率。然而,当哈希冲突导致链表过长时,性能可能会退化到O(n)。为了解决这个问题,可以通过扩容或使用红黑树来保持高效性能。

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

接下来是数据结构中哈希表的总结,哈希表在我以前学python的时候,也被称为散列表。简单的理解来说,哈希表我们翻越的拼音字典,一个拼音对应一个汉字或多个汉字。

哈希表基础

哈希表(Hash Table):也叫做散列表。是根据关键码值(Key Value)直接进行访问的数据结构。也就是说,它通过键 key 和一个映射函数 Hash(key) 计算出对应的值 value,把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做「哈希函数(散列函数)」,存放记录的数组叫做「哈希表(散列表)」。

具体可以参考下面两篇文章,分别采用python和C++实现

01.哈希表知识 | 算法通关手册 (itcharge.cn)

代码随想录 (programmercarl.com)

这里借用上面资料对哈希表进行一个总结

  • 哈希表:通过键 key 和一个映射函数 Hash(key) 计算出对应的值 value,把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
  • 哈希函数:将哈希表中元素的关键键值映射为元素存储位置的函数。
  • 哈希冲突:不同的关键字通过同一个哈希函数可能得到同一哈希地址。

掌握哈希函数,哈希冲突这两个关键的问题,而对于字符串,浮点型等数据也会先转成整形,在通过哈希函数映射。

哈希函数:直接定址法、除留余数法、平方取中法、基数转换法、数字分析法、折叠法、随机数法、乘积法、点积法等。

哈希冲突:开放地址法和链地址法。

下面是STL中的字典结构

映射底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::map红黑树key有序key不可重复key不可修改O(logn)O(logn)
std::multimap红黑树key有序key可重复key不可修改O(log n)O(log n)
std::unordered_map哈希表key无序key不可重复key不可修改O(1)O(1)

C++中STL的哈希表解决哈希冲突采用的链式地址法。

当然这里有一个问题,那就是采用链式地址法的时候,如果每次插入的key所对应的映射值都是同一个,那么最后的结果就是哈希表被退化成了链表,查询效率为O(n)。虽然也有办法解决,那就是扩容因子,比如当你不同key对应同一个值的value时,后面链表长度超过8个,我就给整个空间扩容。不过这样的效果不一定理想,还可以把哈希链表改成红黑树,这样查询速度最低也是O(logn)了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值