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.哈希表的长度
C++哈希表深入解析:构造方法与冲突解决

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

被折叠的 条评论
为什么被折叠?



