本篇博文,旨在介绍哈希表的基本概念及其用法;介绍了减少哈希冲突的方法;并用代码实现了哈希表的线性探测和哈希桶
哈希表的基本概念
哈希表是一种存储结构,它通过key值可以直接访问该key值在内存中从存储位置;
将关键值映射到表中的位置访问数据,这个映射函数叫做散列函数,存储数据的表叫做散列表;
构造哈希表的几种方法
1、直接定址法
根据关键值直接确定元素存取的位置,该散列函数是一个线性函数;例如 Hash(key) = A*key+B,其中,A和B都为常数
2、除留余数法
取出关键值后,将关键值除以该散列表的长度从而获得的余数,作为散列地址;Hash(key) = key%m
3、平方取中法
取关键字平方后的中间几位为哈希地址。由于一个数的平方的中间几位与这个数的每一位都有关,因而,平方取中法产生冲突的机会相对较小。
平方取中法中所取的位数由表长决定。
例: K = 456 , K2 = 207936 若哈希表的长度m=102,则可取79(中间两位)作为哈希函数值。
4、折叠法
将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。数位叠加可以有移位叠加和间界叠加两种方法。
5、随机数法
选择一随机函数,取关键字的随机值作为散列地址,通常用于关键字长度不同的场合。
6、数学分析法
找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。
哈希冲突/哈希碰撞
哈希冲突出现的原因
关键值通过任何的散列函数获得的散列地址都有可能是重复的,这种情况叫做哈希冲突;
载荷因子
散列表的载荷因子的定义为:a = 表中的元素个数/散列表的长度
对于开放定址法,载荷因子特别重要,一般情况下严格控制在0.7-0.8
超过0.8,哈希表的效率会很低
过低的话,浪费的空间会更大