数据结构:哈希表函数构造和冲突解决方法

哈希表

哈希函数:记录的存储位置和它的关键字之间建立一个确定的对应关系f

冲突:对不同的关键字可能得到同一哈希地址,这种现象称为冲突。

哈希函数构造方法

1.直接定址法

取关键字或关键字的某个线性函数值为哈希地址,即:

H(key) = keyH(key) = a*key +b

2.数字分析法

3.平方取中法

取关键字平方后的中间几位为哈希地址。这是一种较常用的构造哈希函数的方法。一个数平方后的中间几位数和数的每一位都相关。

4.折叠法

5.除留余数法

取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址,即

                   H(key) = key MOD p,p\leqslant m

这是最简单也是最常用的构造哈希函数的方法。不仅可以对关键字直接取模,也可以在折叠,平方取中等运算之后取模。

6.随机数法 

冲突处理方法

1.开放定址法

                 H(key) = (H(key) + d_{i}) MOD m,i = 1,2,...,k(k\leq m-1)

H(key)为哈希函数;d_{i}为增量序列,可有下列三种取法:

  1. d_{i} = 1,2,3,...,m-1,称为线性探测再散列;
  2. d_{i} = 1^{2},-1^{2},2^{2},-2^{2},...,称为二次探测再散列;
  3. d_{i}为伪随机数列,称为伪随机探测再散列。

2.再哈希法

                    H_{i} = RH_{i}(key) i = 1,2,...,k

RH_{i}均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生,但是增加了计算时间。

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.建立一个公共溢出区

哈希表的查找及分析

哈希表的装填因子定义为

               \alpha =\frac{num}{l}

num为表中填入的记录数,l为哈希表的长度。标志着哈希表的装满程度。

线性探测再散列的哈希表查找成功时的平均查找长度

                    S\approx \frac{1}{2}(1+\frac{1}{1-\alpha })

随机探测再散列,二次探测再散列查找成功时平均查找长度

                   S\approx -\frac{1}{\alpha }ln(1-\alpha )

链地址法处理冲突的哈希表查找成功时的平均查找长度为

                   S = 1+\frac{\alpha }{2}

参考:

数据结构(c语言版),严蔚敏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章