1.散列函数
- 定义:一个把查找表中的关键字映射成为该关键字的地址的函数,记为Hash(key)=Addr(这里的地址可以是数组下标、索引或内存地址等)
- 散列函数可能会将两个以上的的关键字映射到同一个地址上,称这种情况为冲突。应注意任何设计出来的散列函数都不能避免冲突
2.散列函数的构造方法
- 直接定址法(适用于关键字的分布基本连续的情况)
- 除留余数法(最简单,最常用的情况)
- 数字分析法(适用于已知的关键字集合,若更换了关键字,则需要重新构造散列函数)
- 平方取中法(适用于关键字的每位分布都不够均匀的情况)
- 折叠法(适用于关键字位数很多,而且每位上数字分布大致均匀时)
3.处理冲突的方法
1.开放定址法:
用 H i H_i Hi,表示发生冲突后第i次探测的散列地址,它的数学递推公式为 H i H_i Hi=(H(key) + d i d_i di)%m ,m表示散列表表长, d i d_i di表示增量序列。取定增量序列后,对应的处理方法就是确定的。通常有以下四种取法:
- 线性探测法(当 d i d_i di=0,1,2,3 … \ldots …m-1时)
- 平方探测法(当 d i d_i di= 0 2 0^2 02, 1 2 1^2 12, − 1 2 -1^2 −12, 2 2 2^2 22, − 2 2 -2^2 −22, … \ldots …, k 2 k^2 k2, − k 2 -k^2 −k2时)
- 再散列法(当 d i d_i di= H a s h 2 Hash_2 Hash2(key)时)
- 伪随机序列法(当 d i d_i di=伪随机序列时)
2.拉链法
3.散列表的查找及性能分析
- 散列表的查找过程与散列表的构造过程基本一致。对于一个给定的关键字key,根据散列函数就可以找出其对应的地址。
- 散列表的查找效率取决于三个因素:散列函数、处理冲突的方法、以及装填因子。
-
装填因子:散列表的装填因子因一般记为 α \alpha α,且 α \alpha α= 表 中 记 录 数 n 散 列 表 长 度 n \frac{表中记录数n}{散列表长度n} 散列表长度n表中记录数n