赞
踩
Hash表的平均查找长度包括查找成功时的平均查找长度和查找失败时的平均查找长度。
查找成功时的平均查找长度=表中每个元素查找成功时的比较次数之和/表中元素个数;
查找不成功时的平均查找长度相当于在表中查找元素不成功时的平均比较次数,可以理解为向表中插入某个元素,该元素在每个位置都有可能,然后计算出在每个位置能够插入时需要比较的次数,再除以表长即为查找不成功时的平均查找长度。
下面举个例子:
将关键字序列{7, 8, 30, 11, 18, 9, 14}散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组,长度为10,即{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}。散列函数为: H(key) = (key * 3) % 7,处理冲突采用线性探测再散列法。
求等概率情况下查找成功和查找不成功的平均查找长度。
解:
H(7) = (7 * 3) % 7 = 0
H(8) = (8 * 3) % 7 = 3
H(30) = 6
H(11) = 5
H(18) = 5
H(9) = 6
H(14) = 0
按关键字序列顺序依次向哈希表中填入,发生冲突后按照“线性探测”探测到第一个空位置填入。
H(7) = 0,key = 7应插在第0个位置,因为第0个位置为空,可以直接插入。
H(8) = 3,key = 8应插在第3个位置,因为第3个位置为空,可以直接插入。
H(30) = 6,key = 30应插在第6个位置,因为第6个位置为空,可以直接插入。
H(11) = 5,key = 11应插在第5个位置,因为第5个位置为空,可以直接插入。
H(18) = 5,key = 18应插在第5个位置,但是第5个位置已经被key=11占据了,所以往后挪一位到第6个位置,但是第6个位置被key=30占据了,再往后挪一位到第7个位置,这个位置是空的,所以key=18就插到这个位置
H(9) = 6,key = 9应插在第6个位置,但是第6个位置已经被key = 30占据,所以需要往后挪一位到第7个位置,但是第7个位置已经被key = 18占据,所以再往后挪移到第8个位置,这个位置是空的,所以key = 9就插到这个位置。
H(14) = 0,key = 14应插在第0个位置,但第0个位置已被key=7占据,所以往后挪移一位到第1个位置,这个位置是空的,所以key=14就插到这个位置。
最终的插入结果如下表所示:
address | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
key | 7 | 14 | 8 | 11 | 30 | 18 | 9 |
查找7,H(7) = 0,在0的位置,一下子就找到了7,查找长度为1。
查找8,H(8) = 3,在3的位置,一下子就找到了8,查找长度为1。
查找30,H(30) = 6,在6的位置,一下子就找到了30,查找长度为1。
查找11,H(11) = 5,在5的位置,一下子就找到了11,查找长度为1。
查找18,H(18) = 5,第一次在5的位置没有找到18,第二次往后挪移一位到6的位置,仍没有找到,第三次再往后挪移一位到7的位置,找到了,查找长度为3。
查找9,H(9) = 6,第一次在6的位置没找到9,第二次往后挪移一位到7的位置,仍没有找到,第三次再往后挪移一位到8的位置,找到了,查找长度为3.
查找14,H(14) = 0,第一次在0的位置没找到14,第二次往后挪移一位到1的位置,找到了,查找长度为2。
所以,查找成功的平均查找长度为(1 + 1 + 1 + 1 + 3 + 3 + 2) / 7 = 12 / 7。
查找不成功,说明要查找的数字肯定不在上述的散列表中。
因为这里哈希函数的模为7,所以要查找的数的初始地址只可能位于0~6的位置上。
地址0,到第一个关键字为空的地址2需要比较3次,因此查找不成功的次数为3。比如要查找的数为28,H(28) = (28 * 3) % 7 = 0。即28对应的地址是0,由于存放在0位置的数是7,所以往后挪移一位,发现在1位置存放的数是14,继续往后挪一位,发现位置2上没有数。至此就知道28不在这个哈希表里,即查找28失败。
地址1,到第一个关键字为空的地址2需要比较2次,因此查找不成功的次数为2。
地址2,到第一个关键字为空的地址2需要比较1次,因此查找不成功的次数为1。
地址3,到第一个关键字为空的地址4需要比较2次,因此查找不成功的次数为2。
地址4,到第一个关键字为空的地址4需要比较1次,因此查找不成功的次数为1。
地址5,到第一个关键字为空的地址9需要比较5次,因此查找不成功的次数为5。
比如要查找的数为4,H(4) = (4 * 3) % 7 = 5,所以从地址5开始查找,最终发现地址5、地址6、地址7、地址8上存放的数都不是5,并且地址9的位置上没放数据,至此可知5不在这个哈希表里。
地址6,到第一个关键字为空的地址9需要比较4次,因此查找不成功的次数为4。
所以,查找不成功的平均查找长度为(3 + 2 + 1 + 2 + 1 + 5 + 4)/ 7 = 18 / 7。
为了提高阅读和理解的效率,在这边强调一下:
版权声明:本文为CSDN博主「海天一树」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/haishu_zheng/article/details/77278119
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。