哈希表
哈希表(hash table):根据关键字(Key)而直接进行访问值(Value)的数据结构。
一般我们可以用哈希表来快速判断一个元素是否出现在集合里。
以数组为例,数组也是哈希表——哈希表关键码即数组的索引,这样我们可以通过下标直接访问数组元素。
哈希函数
哈希函数(hash function):把函数值(Value)直接映射为哈希表的索引(Key),然后我们就可以通过查询索引下标快速直到某值是否存在于集合中。
(会通过再次对数值进行取模操作,保证映射到哈希表上)
哈希碰撞
哈希碰撞(Collisions):当元素数量大于哈希表的大小时,无论哈希函数计算多么均匀,也无法避免多个元素同时映射到哈希表的同一个索引位置。
当遇到哈希碰撞时,我们通常有两种解决方法:拉链法 & 线性探测法
1、拉链法
例如当两个元素x和y在索引3的位置发生了冲突,发生冲突的元素都被存储在链表中,这样就可以通过索引找到x和y了。
拉链法就是要选择适当的哈希表的大小:
①不会因为数组空置而浪费大量内存
②不会因为链表太长而浪费大量时间查找
2、线性探测法
注意: 线性探测法中我们需要依靠哈希表中的空位来解决碰撞问题,所以我们在使用线性探测法前,务必要确保tableSize > dataSize。
例如冲突的位置,我们放置了x,那么我们就向下找一个空位置放y。这就时为什么我们要确保tableSize > dataSize,否则哈希表就没有空位置可以用来存放冲突的数据了。
![]()