1、哈希函数的定义
对于一些查找表来说,它的查找过程是:为给定值按某种顺序和记录集合中各个关键字进行比较的一个过程。这类查找表的平均查找长度都是不为0的。
所以,对于查找表,希望ASL(平均查找长度) = 0。只有预先知道所查找的关键字在表中的位置,即要求:记录在表中的位置和其关键字存在一种确定的关系。
关键字(key) ----H------>记录在表中位置
记录在表中的位置为关键字的某个函数值 H(key) ,通常称这个函数 H(key) 为哈希函数。
2、哈希表的定义
哈希表定义:根据设定的哈希函数 H(key)和 所选中的处理冲突的方法,将一组关键字映像到一个有限的连续的地址区间上,并把关键字记录在表中的存储位置,如此构造的查找表称为“哈希表”。
哈希函数是一个映像,即将关键字的集合与映射到某个地址集合上。由于是一个压缩映像,很容易发生“冲突”(即key1 不等于 key2 而 f(key1) = f(key2))。
3、处理冲突的方法
因为很难找到不冲突的哈希函数,所以只能选择恰当的哈希函数 + 处理冲突的方法。
处理冲突的方法:
- 开放地址法
地址序列: H0, H1, H2, …, Hs 1≤ s≤m-1
其中:
H0 = H(key)
Hi = ( H(key) + di ) % m (i=1, 2, …, s)增量 di 有三种取法:
- 线性探测法
di = 1,2,…,k (k<=m-1)- 二次探测法
di = 1的平方, -1的平方, 2的平方, -2的平方, …,- 双哈希函数探测法
Hi=(H(key)+i*RH(key))%m (i=1,2,…,m-1) H(key)、RH(key)为两个哈希函数,m为哈希表长度。
- 链地址法
思路:将所有具有相同哈希地址的不同关键字的数据元素链接到同一个单链表。
- 再哈希函数法
对于哈希函数来说,事先准备多个哈希函数
f (key) = RHi(key) (i = 1,2,…m-1)
RHI就是不同的哈希函数。
思路:每当发生哈希地址冲突时就换一个哈希函数
4、查找成功和不成功的平均查找长度
【实例:】
设关键字序列(7、8、30、11、18、9、14),哈希函数为:H(key) = (keyx3) MOD 7,哈希表长为10,处理冲突采用线性探测法。
(1) 请画出所构造的哈希表。
(2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。
解答:
构建的哈希表是下标为0~9的一维数组。根据散列函数可以得到如下散列函数值,再通过线性探测法得到哈希表过程:
哈希函数:H(Key) = (keyx3) MOD 7
例如:
key=7时, H(7) = (7x3)%7 = 21%7=0,存放在哈希表数组下标为“0”的位置,这个位置无关键字,地址不冲突,填入;
key = 8时, H(8) = (8x3)%7 = 24%7=3,存放在哈希表数组下标为“3”的位置,这个位置无关键字,地址不冲突,填入;
key = 30时, H(30) = (30x3)%7 = 90%7=6,存放在哈希表数组下标为“6”的位置,这个位置无关键字,地址不冲突,填入;
key = 11时, H(11) = (11x3)%7 = 33%7=5,存放在哈希表数组下标为“5”的位置,这个位置无关键字,地址不冲突,填入;
key = 18时, H(18) = (18x3)%7 = 54%7=5,这个位置存在关键字,地址冲突,
采用线性探测法:H(18) = (5 + 1)%7 = 6,存在关键字,地址冲突,
再采用线性探测法:H(18) = (5 + 2)%7 = 7,地址不冲突,
存放在哈希表数组下标为“7”的位置;
其他关键字同理。
所以构造的散列表为:
等概率情况下查找成功平均查找长度:
ASL(成功)= (1+1+1+1+3+3+2)/ 7 = 12/7 ,各个关键字查找成功时的查找次数除以关键字序列的长度。
等概率情况下查找不成功平均查找长度:
接下来讨论不成功的情况, 看上表,计算查找不成功的次数就直接找关键字到第一个地址上关键字为空的距离即可, 但根据哈希函数地址为MOD7,因此初始只可能在0-6的位置。等概率情况下,查找0~6位置查找失败的查找次数为:
看地址0,到第一个关键字为空的地址2的距离为3,因此查找不成功的次数为3.
地址1, 到第一个关键为空的地址2的距离为2,因此查找不成功的次数为2.
地址2, 到第一个关键为空的地址2的距离为1,因此查找不成功的次数为1.
地址3,到第一个关键为空的地址4的距离为2,因此查找不成功的次数为2.
地址4,到第一个关键为空的地址4的距离为1,因此查找不成功的次数为1.
地址5,到第一个关键为空的地址2(注意不是地址9,因为初始只可能在0~6之间,因此循环回去)的距离为5,因此查找不成功的次数为5.
地址6,到第一个关键为空的地址2(注意不是地址9,因为初始只可能在0~6之间,因此循环回去)的距离为4,因此查找不成功的次数为4.
ASL(不成功)= ((3+2+1+2+1+5+4)/ 7 = 18/7 ,各个关键字查找成功时的查找次数除以构造的哈希函数的哈希表长度(注意并不是关键字序列长度,而是根据哈希函数地址为MOD7,初始化的哈希表长度为7。只不过本题初始化的哈希表长度跟关键字序列长度相同而已)。