构造哈希函数需要注意一下几点 :
直接取关键字的某个线性函数值为哈希地址,哈希函数为:
H(key) = a*key + b
其中,a和b为常数
不足:
这是一种简单/最常用的方法,嘉定哈希表表长为m,取一个不大于m但最接近或等于m的质数p,利用一下公式把关键字转化成哈希地址:
H(key) = key % p
除留余数法关键是选好p,使每一个关键字经过哈希函数转换后等概率的映射到散列空间的任一地址,从而尽可能减少冲突的可能性
分析一组数据,比如一组员工的出生年月日,这时我们发现出生年月日的前几位数字大体相同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。
取关键字平方后的中间几位作为散列地址。
将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。
冲突后,线性向前试探,找到下一个空位置。缺点是会出现堆积现象。存取时,可能不是同义词的词也位于探查序列,影响效率。
当通过第一个哈希函数H1(key)得到的哈希地址发生冲突时,利用第二个哈希函数H2(key)计算该关键字的哈希地址
对于不同的关键字可能会通过哈希函数映射到同一个地址,为了避免非同义词发生冲突,可以把所有的同义词存储在一个线性链表中,这个线性链表由其哈希地址唯一标识
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKINeJPz-1583679651011)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20200308225803-image.png)]