如何完成令人满意的散列呢?需要完成两个基本的任务 1 设计散列函数 2 制定预案,发生冲突后可以排解
什么样的散列函数更好呢?
1 确定,同一关键码总是被映射到同一地址
2 快速 expected---
3 满射 尽可能充分地覆盖整个散列空间
4 均匀 关键码映射到散列表各位置的概率尽量接近,可有效避免聚集现象
确定散列函数的一些方法
1 除余法 hash(key)=key%M,M要取素数
2 MAD法 除余法缺陷,1不动点:无论表长M取值如何,总有hash(0)恒等于0
2零阶均匀:[0,R)关键码,平均分配至M个桶;但相邻关键码的散列地址也必相邻
所以取M为素数,a>0,b>0,a%M不等于0,hash(Key0=(a*key+b)%M
3 数字分析 抽取key中的某几位,构成地址
4 平方取中 取key^2的中间若干位,构成地址,比如hash(123)=512,key^2=15129
5 折叠法 将key分割成等宽的若干函数,取总和作为地址
注意的是如果key为字符串该如何处理呢?下面给出方法