定义:
存储位置=f(关键字)
可以通过关键字获取存储位置 -----散列技术
记录存储位置和关键字一种确定对应关系,使得每个关键字key 对于一个存储位置 f(key) 这种关系又称为哈希函数Hash函数
冲突 key1!=key2 f(key1)!= f(key2) collision
1.直接定址法
f(key) = a*key+b (a b 为常数) 不常用 需要事先知道关键字分布 适合表小时
2.数字分析法
1234
fun(key) = f(4321) 数字倒序 f(12+34) 分开相加
适合关键字位数大 需事先知道关键字 并且关键字若干位分布均匀
3.平分取中法
1234 平分 1522759
fun(key) = fun(227) 取中间三位
不知道关键字 分布 位数不大
4.折叠法
123334441
fun(key) = fun(123+333+444+1) 每三个分组 在相加
适合关键字位数过大 不知道关键字分布
5.扣留余数法
f(key) = f(key mod p) 取余数 p的取值 最好 <= 表长 最好接近表长的质数或不包含小于20质因子合数 (529=23X23)
最常用 有冲突key
6.随机数方法
f(key) = f(random(key)) rondow 随机数
关键字长度不等的情况下使用
使用以上函数考虑考虑使用参数
1.计算散列地址所需时间
2.关键字长度
3.散列表大小
4.关键字分布情况
5.记录查询的频率
1.key冲突解决办法
1.开放定址法
f(key) = f(key+di) mod m (1,2,3, m-1)
2.二次定址法
f(key) = f(key+di) mod m (1²,-1²,2²,-2² ,q², -q²) q<=m/2
两个方向寻找新地址 加平方根 不让关键字聚集在一起
3.链地址法
提供了绝不会出现找不到地址的保障, 这也带来了查找单链表带来的性能损失