C++八股文分享---数据结构其二---哈希表

C++哈希表深入解析:构造方法与冲突解决
本文介绍了哈希表的概念,强调了其优于搜索二叉树的高效查找特性,并详细探讨了哈希函数的构造方法、哈希冲突的解决策略,包括线性探测、二次探测、链地址法等。此外,还讨论了哈希表元素的插入、rehash过程以及删除操作,特别指出删除时在开放定制法中需注意的问题。最后,解释了为何哈希表的桶个数通常选择质数,以降低冲突概率并提高效率。

C++八股文分享—数据结构其二—哈希表

前言

什么是哈希表?

搜索二叉树对值的查找是通过从根节点开始,逐个节点与目标值做比较,向下查找,直至找到目标值或是到达根节点未查找到,时间复杂度为O(logn)。而哈希表,则是通过将value与key成对绑定,将key带入哈希函数,即可得到目标值的存放地址,从而得到目标值,在不考虑哈希冲突的情况下,时间复杂度为O(1)。
哈希表其实可以理解为一个特殊的数组。我们通常使用的数组,通过下标0开始,直至数组长度len-1,依次存储数组元素,他们的地址是连续的。而哈希表是使用一段比原数据大一些的数组,通过哈希函数将key映射到数组中的某个地址上,存放是不连续的。

例如我们现在有int nums[20]一个整数数组,访问nums[3]的步骤为:
1、取到nums数组的首地址
2、根据首地址偏移sizeof(int)*3个字节,即可到达nums[3]的存储位置,得到其中元素

例如我们现在有一个哈希表hashmap(string, int) myhash,存储的是某人的身高。
myhash["张三"] = 175,myhash["李四"] = 180, 代表张三身高175cm,李四身高180。
现在获取张三身高myhash["张三"]的步骤为:
1、index = H("张三"),通过哈希函数H,得到哈希表内部对应数组的地址index 
2、使用访问index指向的内存区域,得到张三的身高175

哈希函数的构造方法:

1、数字分析法 2、平方取中法 3、折叠法 4、除留余数法 。主要使用方法4。

哈希函数的注意事项:
1.计算散列地址所需要的时间(即hash函数本身不要太复杂)
2.关键字的长度,key过长就要考虑使用折叠法和除留余数法
3.哈希表的长度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值