1.散列表的定义
元素的存储位置和它的关键码之间建立一个确定的对应关系H,使得每个关键码key和唯一的存储位置H(key)相对应。在查找时,根据这个确定的对应关系找到给定值k的映射H(k),若查找集合中存在这个记录,则必定在H(k)的位置上,这种查找技术称为散列技术。
采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表,也称为哈希表(Hash)。
散列既是一种存储方法,也是一种查找方法。散列不是一种完整的存储结构,主要是面向查找的存储结构。
散列方法一般不适用于多个记录有同样关键码的情况。不适用于范围查找。
对于两个不同的关键码k1≠k2,有H(k1)=H(k2),即两个不同的记录需要存放在同一个存储位置中,这种现象称为冲突。
2.常见的散列函数
1>直接定址法
直接定址法的散列函数是关键码的线性函数:H(key) = a * key + b (a, b为常数)
特点:单调,均匀,不会产生冲突,但实际中使用这种散列函数的情况很少。
适用:事先知道关键码的分布,且关键码集合不是很大而连续性较好的情况。
2>除留余数法
基本思想:选择某个适当的正整数p,以关键码除以p的余数作为散列地址,即:H(key) = key mod p;
一般情况下,散列表表长为m,通常p为小于或等于表长(最好接近m)的最小素数或不包含小于20质因子的合数。
3>数字分析法
根据关键码在各个位上的分布情况,选取分布比较均匀的若干位组成散列地址。
4>平方取中法
对关键码平方后,按散列表大小,取中间的若干位作为散列地址(平方后截取)。
5>折叠法
将关键码从左到右分割成位数相等的几部分,最后一部分位数可以短些,然后将这几部分叠加求和,并按散列表表长,取后几位作为散列地址。
3.处理冲突的方法
1>开放定址法:由关键码得到的散列地址一旦产生了冲突,就去寻找下一个空的散列地址,只要散列地址足够大,空的散列地址总能找到。
1)线性探测法:当发生冲突时,线性探测法从冲突位置的下一个位置起,依次寻找空的散列地址
2)二次探测法
2>拉链法:将所有散列地址相同的记录,存储在一个单链表中。在散列表中存储的是所有字表的头指针。