定义
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
构造方法
(1)直接定址法
直接用关键字k本身加上某一个数值常数作为哈希地址:h(k)=k+c
(2)除留余数法
用关键字k除以某个不大于哈希表长度m的数p,将余数作为哈希地址的方法;这种方法应用最广,理论上来说选择一个不大于m的素数效果最好
h(k)=k mod p(p<m)
(3)数字分析法
在已知所有关键字值的情况下对关键字中的每一位的取值情况进行分析取其中取值较为均匀的数字位作为关键字
(4)平方取中法
把关键字平方后取数值均匀的数字位作为哈希地址
(5)折叠法
把关键字分为几小组,各小组折叠相加后分布均匀的几位作为哈希地址
产生碰撞解决方法
(1)开放地址法
开放地执法有一个公式:H=(H(key)+di) MOD m i=1,2,...,k(k<=m-1)
(a)线性探查法
di的取值为1,2,3,4,5......m-1
(b)平方探查法也叫二次探测再散列
di的取值为+k*k,-k*k,....+(m-1)*(m-1),-(m-1)*(m-1)
(c)伪随机探测
di的取值为伪随机数
(2)拉链法也叫链地址法
把所有同义词用单链表连接起来
(3)再哈希
如果第一位有冲突就哈希第二位,否则就第三位。直到没有碰撞,缺点是耗费时间长
附上一道面试题:
已知一个线性表(38,25,74,63,52,48),采用的散列函数为H(Key)=Key%7,将元素散列到表长为7的哈希表中存储。若采用线性探测的开放定址法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为 ____ ;
若利用拉链法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为 ____
38 25 74 63 52 48 mod 7分别是 3 4 4 0 3 6
所以采用线性探测的开放定址法解决冲突,表为:
63,48, ,38,25,74,52
找38,1次
找25,1次
找74,2次
找63,1次
找52,4次
找48,3次
所以成功查找的平均长度为(1+1+2+1+4+3)/6=2
拉链法
建立的为:
63,,,38 –>52,25->74, ,48
找38,1次
找25,1次
找74,2次
找63,1次
找52,2次
找48,1次
所以成功查找的平均长度为(1+1+2+1+2+1)/6=1.333
若利用拉链法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为 ____
38 25 74 63 52 48 mod 7分别是 3 4 4 0 3 6
所以采用线性探测的开放定址法解决冲突,表为:
63,48, ,38,25,74,52
找38,1次
找25,1次
找74,2次
找63,1次
找52,4次
找48,3次
所以成功查找的平均长度为(1+1+2+1+4+3)/6=2
拉链法
建立的为:
63,,,38 –>52,25->74, ,48
找38,1次
找25,1次
找74,2次
找63,1次
找52,2次
找48,1次
所以成功查找的平均长度为(1+1+2+1+2+1)/6=1.333