【C++庖丁解牛】哈希表/散列表的设计原理 | 哈希函数

马肤
这是懒羊羊
【C++庖丁解牛】哈希表/散列表的设计原理 | 哈希函数,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,没有,进行,使用,第1张 🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油

【C++庖丁解牛】哈希表/散列表的设计原理 | 哈希函数,在这里插入图片描述,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,没有,进行,使用,第2张


目录

  • 前言
  • 1.哈希概念
  • 2.哈希冲突
  • 3.哈希函数
  • 4.哈希冲突解决
    • 4.1闭散列
    • 4.2 开散列

      前言

      unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构。

      1.哈希概念

      哈希又称为散列,有些书上对于哈希取名为散列表,其本质就是一个存储的值和存储的位置的映射

      顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( l o g 2 N log_2 N log2​N),搜索的效率取决于搜索过程中元素的比较次数。

      理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。

      如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。

      当向该结构中:

      • 插入元素

        根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放

      • 搜索元素

        对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若关键码相等,则搜索成功

        该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(Hash Table)(或者称散列表)

        例如:数据集合{1,7,6,4,5,9};

        哈希函数设置为:hash(key) = key % capacity; capacity为存储元素底层空间总的大小。

        【C++庖丁解牛】哈希表/散列表的设计原理 | 哈希函数,在这里插入图片描述,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,没有,进行,使用,第3张

        用该方法进行搜索不必进行多次关键码的比较,因此搜索的速度比较快

        问题:按照上述哈希方式,向集合中插入元素44,会出现什么问题?

        使用上面这个方法就可以发现44 % 10 = 4,就会出现哈希冲突/哈希碰撞,不同的值可能会映射到相同的位置,一个空间只能存储一个值,就会出现冲突

        2.哈希冲突

        对于两个数据元素的关键字 k i k_i ki​和 k j k_j kj​(i != j),有 k i k_i ki​ != k j k_j kj​,但有:Hash( k i k_i ki​) == Hash( k j k_j kj​),即:不同关键字通过相同哈希哈数计算出相同的哈希地址,该种现象称为哈希冲突或哈希碰撞。

        把具有不同关键码而具有相同哈希地址的数据元素称为“同义词”。

        发生哈希冲突该如何处理呢?

        3.哈希函数

        引起哈希冲突的一个原因可能是:哈希函数设计不够合理。

        哈希函数设计原则:

        • 哈希函数的定义域必须包括需要存储的全部关键码,而如果散列表允许有m个地址时,其值域必须在0到m-1之间
        • 哈希函数计算出来的地址能均匀分布在整个空间中
        • 哈希函数应该比较简单

          常见哈希函数:

          1. 直接定址法–(常用)

          取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B

          优点:简单、均匀

          缺点:需要事先知道关键字的分布情况

          使用场景:适合查找比较小且连续的情况

          1. 除留余数法–(常用)

          设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函数:Hash(key) = key% p(p EMPTY, //空 EXIST, //存在数据 DELETE //删除 }; template pair private: vector


文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复:表情:
评论列表 (暂无评论,0人围观)

还没有评论,来说两句吧...

目录[+]

取消
微信二维码
微信二维码
支付宝二维码