1、基本概念
1.1 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置 f(key)
其中f称为散列函数或哈希函数
1.2 采用散列技术将记录存储在一块连续的存储空间,这块连续的存储空间称为散列表或哈希表
1.3 散列技术最适合的技术是查找与给定值相等的记录
1.4 冲突:如果两个关键字key1 ≠ key2,但是却有 f(key1)=f(key2)
1.5 散列函数的基本原则
计算简单
散列地址均匀分布
2、散列的常用方法
2.1 直接定址法
取关键字的某个线性函数值为散列地址,如
f(key) = a*key + b (a,b为常量)
直接定址法简单,分布均匀,也不会产生冲突
但需要事先知道关键字的分布情况,适合查找表较小且连续的情况
不常用
2.2 数字分析法
如果关键字位数较大,且事先知道关键字的分布且关键字的若干位分布较均匀,可以使用分析法。比较常用
2.3 平方取中法
如1234的平方1522756,抽取中间三维227位散列地址。
比较适合不知道关键字的分布,且位数不多的情况
2.4 折叠法
将关键字分割为若干部分,再将它们相加得到散列地址。
不需要知道关键字的分布情况,适合位数多的情况
2.5 除留余数法
f(key) = key mod p
最重要的是选好p的值 防止冲突
2.6 随机数法
f(key) = random( key )
适合关键字长度不等的情况
3、冲突处理
3.1 开放定址法
3.1.1 线性探测法
一旦发生冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能被找到,记录会被存入。
fi
(key) = ( f(key) +
di
) mod m (d = 1,2…m-1)
3.1.2 二次探测法
fi
(key) = ( f(key) +
di
) mod m (d =
12
,
−12
,
22
,
−22
,…
q2
,
−q2
, q<=m/2)
使用平方使得关键字不聚集在某一块区域
3.1.3 随机探测法
fi
(key) = ( f(key) +
di
) mod m (
di
是一个随机数)
3.2 再散列法
准备多个散列函数,如果冲突,用另一个散列函数
3.3 链地址法
将冲突的值用单链表存储
3.4 公共溢出区法
将冲突的数据统一放到冲突表中
参考:
大话设计模式