数据结构学习:哈希表
简介
**散列表(Hash Table)**也叫哈希表,是根据键(key)直接访问在内存存储位置的数据结构,所以,它是一个通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,加快了查找速度。这个映射函数称为散列函数,存放记录的数组称作散列表。
哈希函数的构造方法
直接定制法
哈希函数为关键字的线性函数如 H ( k e y ) = a ∗ k e y + b H(key) = a*key+b H(key)=a∗key+b,这种构造方法比较简便均匀,但是限制很大,仅限于地址大小=关键字集合的情况。
数字分析法
假设关键字集合中每个关键字key都由s位数字组成(k1,k2,k3,…,kn),分析key中全体数据,并从中提取分布均匀的若干位或他们的组合构成全体。这种方法通常用于数字位数较长的情况,必须数字存在一定规律,且必须知道数字的分布情况。
平方取中法
如果关键字的每一位都有某些数字重复出现频率很高的现象,可以先求关键字的平防止,通过平方扩大差异,而后取中间数位作为最终存储地址。这种方法适合事先不知道数据并且数据长度较小的情况。
折叠法
如果数字的位数很多,可以将数字分割为几个部分,取他们的叠加和作为hash地址,该方法适用于数字位数较多且事先不知道数据分布的情况。
除留余数法
这种方法用得最多, H ( k e y ) = k e y m o d p ( p < = m , m 为 表 长 ) H(key) = key mod p(p <= m,m为表长) H(key)=keymodp(p<=m,m为表长)。
随机数法
使用随机函数值作为关键字。
hash函数设计的考虑因素
- 计算散列地址所需要的时间(即hash函数本身不要太复杂)。
- 关键字的长度。
- 表长。
- 关键字分布是否均匀,是否有规律可循。
- 设计的hash函数在满足以上条件的情况下尽量减少冲突。
哈希冲突
不论hash函数设计的如何巧妙,总会有特殊的key导致hash冲突,特别是对动态查找表来说。
解决hash冲突一般有以下几个方法:
- 开发定制法
- 链地址法
- 公共溢出区法
- 再散列法
hash表的主要操作
查找
查找过程与构造hash表过程一致,假设采用开放定址法处理冲突,则查找过程为:对于给定的key,计算hash地址index = H(key),如果数组arr[index]值为空,则查找失败;如果数组arr[index]==key,则查找成功;否则使用冲突解决方法求下一个地址,直到查找成功或查找失败。
查找效率
决定hash表查找的ASL因素:
- 选用的hash函数
- 选用的处理冲突的方法
- hash表的饱和度
删除
链地址法是可以直接删除元素的。其他方法是删除之后放入一个原来不存在的数据。
源码
后续补上