hash table ,也叫散列表。涉及到哈希函数、哈希冲突处理的问题。哈希函数是哈希表的关键,是用来从值到哈希表索引(存放位置)的映射。
比如:要存放一个学校学生的姓名,他们是Amanda, Jack, Andy, Tom, Bob, Black等等500个人。我们可以设计一个哈希表,容量为500,来存放这些学生的信息。哈希表的目的是快速访问,利用数组的随机访问性,快速的通过下表访问元素。需要设计一个哈希函数,来决定每个人存在什么地方。比如有一个哈希函数:
h(name) = {
return name[0] -'A'
}
这个函数会按照首字母序把信息放在对应位置。但是Andy和Amanda会造成冲突,因为一个位置上不能存两个人,Amanda去存时发现Andy已经占用了这个位置,此时就需要冲突处理。
一、基本概念
散列法存储的思想是由关键字值和hash函数决定数据的存储地址。哈希表是单向的,即通过key获得hash值,可以得到存储地址,而反过来知道hash,无法算得key。
例如,最多有31个不重复的0~999之间的数字需要存放,此时可以用一个31容量的数组保存这些数字,并且使用一个hash 函数:
h(i) = n mod 31
将这些0~999的数字映射到0~30。但是会存在哈希冲突的问题。比如95和64映射的结果都是2,此时就需要解决哈希冲突了。
二、常用的哈希函数
1、直接定址法
直接定址法的哈希函数是关键码的线性函数,即: H(key)=a*key+b (a,b为常数)。
2、除留余数法
除留余数法的基本思想是:选择某个适当的正整数p,以关键码除以p的余数作为哈希地址,即H(key)=key mod p,其中哈希表的大小最好是质数,即P是质数。
3、数字分析法
数字分析法根据关键码在各个位上的分布情况,选取分布比较均匀的若干位组成哈希地址。
4、平方取中法
平方取中法是对关键码平方后,按散列表大小,取中间的若干位作为散列地址。
5、折叠法
折叠法是将关键码从左到右分割成位数相等的几部分,最后一部分位数可以短些,然后将这几部分叠加求和,并按哈希表表长,取后几位作为哈希地址。通常有两种叠加方法: