【C++进阶】哈希表(哈希函数、哈希冲突、开散列、闭散列)

本文介绍了哈希表的概念、哈希函数的设计原则,以及解决哈希冲突的两种方法:闭散列和开散列。同时对比了哈希表与红黑树的优劣,强调了根据应用场景选择合适数据结构的重要性。

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

🪐🪐🪐欢迎来到程序员餐厅💫💫💫

          主厨:邪王真眼

主厨的主页:Chef‘s blog  

所属专栏:c++大冒险
 

 总有光环在陨落,总有新星在闪烁


引言:

             我们之前学习了红黑树及其应用,它增删查改的时间复杂度仅仅只有log N,然而,今天我们会学习的哈希直接把增删查改的时间复杂度降低到了O(1)!心动了对吧?那就快来学习吧。

一、哈希概念

       顺序结构以及平衡树中,元素关键码(Key)与其存储位置之间 没有对应的关系 ,因此在查找一个元素时 必须要经过关键码的多次比较
顺序查找时间复杂度为O(N),平衡树中为O(log N)

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

        构造一种存储结构,通 过某种函数使元素的存储位置与它的关键码能够建立一一映射的关系 ,那么在查找时通过该函数可以很快找到该元素。该方式即为 哈希(散列)方法, 构造出来的结构称 哈希表(Hash Table ),或称散列表。
例如:
       对于数据集合{1,7,6,4,5,9};
哈希函数设置为:hash(key) = key % capacity; capacity为存储元素底层空间总的大小

二、 哈希函数

哈希方法中使用的转换函数称为哈希(散列)函数

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

常见哈希函数

2.1 直接定址法--(常用)

Hash(Key)= A*Key + B
  1. 优点:简单、均匀
  2. 缺点:需要事先知道关键字的分布情况
  3. 使用场景:适合查找比较小且连续的情况

2.2. 除留余数法--(常用)

设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值