哈希表(散列表)的平均查找成功/失败长度
计算哈希地址的方法,称之为哈希函数。
常见的计算哈希地址方法有:
1、直接定址法
2、除留余数法
3、数字分析法
4、平方取中法
本文所分析的是使用除留余数法计算哈希地址这类,的平均查找成功长度和查找失败长度
对于除留余数法的哈希函数(散列函数)
H(key) = key % p(n)
p(n)为不超过表长的最大素数。
如何计算平均查找/失败长度?
哈希表可以使用闭散列(开放定址法),也可以使用开散列(拉链法,哈希桶)进行构造。目前我在哈希中所遇到过的让计算平均查找成功/失败长度的情况,只有使用闭散列的线性探测构造的散列表 和 拉链法构造的散列表。
拉链法构造的散列表
查找成功的平均查找长度(拉链法)
计算查找成功的平均查找长度的前提,是查找成功,意味着能够在当前的散列表中找到。
查找到每一个位置上的概率为 1/总数据元素个数
查找了1层就查找成功概率P1为:
(1 / 总数据元素个数 )* 第一层的数据元素个数
查找了2层就查找成功的概率P2:
(1 / 总数据元素个数)* 第2层的数据元素个数
…
查找了n层长度的查找成功的概率Pn为:(1 / 总数据元素个数)* 第n层的数据元素个数
查找成功的平均查找长度 = P1 * 1 + P2 * 2 + P3 *2 + … + Pn * n
例如:
一共有11个数据元素,查找成功一定会找到这11个数据元素的位置上,那么落在这些位置上的概率都是1/11。
第一层有7个数据元素,所以找一层就找到了的概率为7 / 11
第二层有2个数据元素,所以找二层就找到了的概率为2 / 11
…
根据数学期望的知识
可知查找成功的平均查找长度ASL = 7/11 * 1 + 2/11 * 2 + 1/11 * 3 + 1/11 * 4 = 18/11
查找失败的平均查找长度(拉链法)
计算查找失败的平均查找长度的前提,是查找失败,意味着我们查找的位置一定落在没有数据的位置上。注意:查找到0层,意味着通过计算的哈希地址去找,这个哈希地址下根本没有数据元素。
查找了0层就查找失败的概率P0:(1 / 查找失败可能落在的位置总个数)* 第0层的查找失败可能落在的位置个数
查找了1层就查找失败的概率P1:(1 / 查找失败可能落在的位置总个数)* 第1层的查找失败可能落在的位置个数
查找了2层就查找失败的概率P2:(1 / 查找失败可能落在的位置总个数)* 第2层的查找失败可能落在的位置个数
…
查找了n层就查找失败的概率Pn:(1 / 查找失败可能落在的位置总个数)* 第n层的查找失败可能落在的位置个数。
查找失败的平均查找长度 = P0*0 + P1 * 1 + P2 * 2 + P3 *2 + … + Pn * n
例如:
当我们按照规则去查找的时候,找到下面红色圈圈标起来的位置时,就说明要找的数据不在散列表中,所以上图查找失败可能落在的位置总个数为13
。那么在查找失败的前提下,落在圈起来的位置上的每一个概率都是1/13
当我们计算出来的哈希位置,根本没有数据,压根不需要找就知道它不在 ===> 查找0层就查找失败了。
此例中查找了0层就查找失败的概率P0 = 6 * (1 / 13) = 6/13
查找了1层就查找失败的概率P1 = 5* (1 / 13) = 5/13
查找了2层就查找失败的概率P1 = 1* (1 / 13) = 1/13
查找了4层就查找失败的概率P1 = 1* (1 / 13) = 1/13
所以查找失败的平均查找长度ASL = 6/13 * 0 + 5/13 * 1 + 1/132 + 1/134 = 11/13
线性探测构造的散列表
使用线性探测来构造散列表,首先使用哈希函数计算出哈希地址后,如果出现哈希冲突,那么依次向后去寻求一个空位置来存放。
查找失败的查找平均长度(线性探测)
注意:查找失败的情况,不是根据哈希表中实际存储的有效数据个数,也不是根据哈希表的长度来计算的。
计算查找失败的平均长度取决于
1.哈希函数
2.空位置
为什么?为了不那么晦涩,我使用实际的例子进行说明。(这里的空位置就是没有保存数据,没有被标记删除)
回顾线性探测,哈希的查找过程:首先使用哈希函数计算出哈希地址,从哈希地址开始进行查找,如果当前不存在则向后依次去查找,一直到查找到正确位置或者找到了空位置为止,而找到空位置时也说明了我们要查找的数据元素根本不在该哈希表内。
假设我们给出的哈希函数是H(key) = (key*3)%7
对于一个数去%7,算出来的值不会超过7,故而查找时计算出的哈希地址只可能是0、1、2、3、4、5、6
假设我们要查找一个关键字m,计算出的哈希地址为0,
1.先去探测哈希地址0,发现不是,
2.去探测哈希地址1,发现不是
2.去探测哈希地址2,发现是空位置
发现是空的,说明查找失败了
因此计算出的哈希地址为0的关键字,在该哈希表中查找失败的长度为3
同理,计算出的哈希地址为1的关键字,在该哈希表中查找失败的长度为2
计算出的哈希地址为2的关键字,在该哈希表中查找失败的长度为1
计算出的哈希地址为3的关键字,在该哈希表中查找失败的长度为2
…
根据上述的推导过程,我们就可以得出查找失败的所有情况。
故而,查找失败的情况只取决于哈希函数和空位置。
而对于一个需要查找的关键字,在还不知道具体数值的情况下,我们认为它计算出来的哈希地址落在每一个地址(0~6)的概率都相同,即1/7
根据数学期望的知识,可知查找失败的平均查找长度为:
ASL = 3*(1/7)+ 2*(1/7)+1*(1/7)+2*(1/7)+1*(1/7)+5*(1/7)+4*(1/7)=18/7
查找成功的查找平均长度(线性探测)
查找成功,说明我们要找的关键字一定是该哈希表中已经存在的。
该哈希表中一共有7个有效数据元素,那么在等概率情况下和查找成功的前提下,落在每一个有效数据位置的概率为1/7
.假设我们给出的哈希函数是H(key) = (key*3)%7
如果我们查找的是7,7的哈希地址是(7*3)%7= 0,从哈希地址0开始探测,探测一次,就找到了
如果我们查找的是14,14的哈希地址是0,从哈希地址0开始探测
1.探测哈希地址0,发现不是
2.探测哈希地址1,发现是
所以查找14的探测(查找)长度为2
…
根据上述的推导过程,我们就可以得出查找成功的所有情况。
而查找成功的前提下,并且等概率的情况下,查找的是其中某一个关键字的概率是1/7
根据数学期望的知识,可以得出:
查找成功的平均查找长度ASL=1*(1/7)+2*(1/7)+1*(1/7)+1*(1/7)+1*(1/7)+3*(1/7)+3*(1/7)= 12/7
更多推荐
所有评论(0)