C++ 哈希表

哈希表

哈希表(hash table):根据关键字(Key)而直接进行访问值(Value)的数据结构。

一般我们可以用哈希表来快速判断一个元素是否出现在集合里

数组为例,数组也是哈希表——哈希表关键码即数组的索引,这样我们可以通过下标直接访问数组元素。

哈希函数

哈希函数(hash function):把函数值(Value)直接映射为哈希表的索引(Key),然后我们就可以通过查询索引下标快速直到某值是否存在于集合中。

(会通过再次对数值进行取模操作,保证映射到哈希表上)

哈希碰撞

哈希碰撞(Collisions):当元素数量大于哈希表的大小时,无论哈希函数计算多么均匀,也无法避免多个元素同时映射到哈希表的同一个索引位置。

当遇到哈希碰撞时,我们通常有两种解决方法:拉链法 & 线性探测法

1、拉链法

       例如当两个元素x和y在索引3的位置发生了冲突,发生冲突的元素都被存储在链表中,这样就可以通过索引找到x和y了。

拉链法就是要选择适当的哈希表的大小:

        ①不会因为数组空置而浪费大量内存

        ②不会因为链表太长而浪费大量时间查找


2、线性探测法

       注意: 线性探测法中我们需要依靠哈希表中的空位来解决碰撞问题,所以我们在使用线性探测法前,务必要确保tableSize > dataSize。

       例如冲突的位置,我们放置了x,那么我们就向下找一个空位置放y。这就时为什么我们要确保tableSize > dataSize,否则哈希表就没有空位置可以用来存放冲突的数据了。

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值