哈希表
哈希函数:记录的存储位置和它的关键字之间建立一个确定的对应关系。
冲突:对不同的关键字可能得到同一哈希地址,这种现象称为冲突。
哈希函数构造方法
1.直接定址法
取关键字或关键字的某个线性函数值为哈希地址,即:
或
2.数字分析法
3.平方取中法
取关键字平方后的中间几位为哈希地址。这是一种较常用的构造哈希函数的方法。一个数平方后的中间几位数和数的每一位都相关。
4.折叠法
5.除留余数法
取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址,即
这是最简单也是最常用的构造哈希函数的方法。不仅可以对关键字直接取模,也可以在折叠,平方取中等运算之后取模。
6.随机数法
冲突处理方法
1.开放定址法
为哈希函数;为增量序列,可有下列三种取法:
- ,称为线性探测再散列;
- ,称为二次探测再散列;
- 为伪随机数列,称为伪随机探测再散列。
2.再哈希法
均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生,但是增加了计算时间。
3.链地址法
将所有关键字为同义词的记录存储在同一线性链表中。
平均查找长度以牛客网中的一个题目举例:
设散列表的长度为10,散列函数H(n)=n mod 7,初始关键字序列为 (33,24,8,17,21,10),用链地址法作为解决冲突的方法,平均查找长度是():
33/7=5, 查找33需要1次;
24/7=3,查找24需要1次;
8/7=1,查找8需要1次;
17/7=3,查找17需要2次;
21/7=0,查找21需要1次;
10/7=3,查找10需要3次;
ASL=每个关键字查找的次数之和/关键字的个数=(1+1+1+2+3+1)/6=1.5
4.建立一个公共溢出区
哈希表的查找及分析
哈希表的装填因子定义为
,
为表中填入的记录数,为哈希表的长度。标志着哈希表的装满程度。
线性探测再散列的哈希表查找成功时的平均查找长度
,
随机探测再散列,二次探测再散列查找成功时平均查找长度
,
链地址法处理冲突的哈希表查找成功时的平均查找长度为
。
参考:
数据结构(c语言版),严蔚敏