对于查找成功时的平均查找长度,书上有明确的定义:
而题目设定条件都是在等概率下查找,所以ASL=(C0+C1+...+Cn)*1/n.
这就说明了查找成功是针对关键字查找的,最后除以关键字的总个数。
我们来看一道书上的例题:
构建出来的哈希表有八个元素,针对这八个元素的比较次数,得出ASLsuccess=(1+1+1+2+1+2+1+2)/8=11/8.
而查找失败时的平均查找长度,却是针对位置的查找。
为什么呢,因为如果我们要查找表中的元素,那么一定可以找到,所以讨论查找失败就没有意义。我们讨论查找失败,一定是针对表中没有的元素在这张表中查找,才有查找失败的意义。
所以,针对上图的哈希表,我们将待查找关键字X代入哈希函数,我们设定X与这张表中的关键字都不相同:
当H(X)=3X mod 11=0时,因为散列地址为0的位置没有关键字,所以查找1次就失败了;
当H(X)=3X mod 11=1时,因为散列地址为1的位置有关键字4,X与4不等,所以按照线性探测法向后探测1,散列地址为2的位置没有关键字,所以查找失败,一共查找了2次;
当H(X)=3X mod 11=2时,同0;
当H(X)=3X mod 11=3时,因为散列地址为3的位置有关键字12,X与12不等,所以向后线性探测,散列地址为4的位置有关键字49,还不等,继续探测,因为X与表中的关键字都不等,所以直到散列地址为10没有关键字,才查找失败,这次一共查找了8次;
…以此类推
综上所述,我们可以得出结论:
失败查找次数就是该位置向后探测到第一个没有关键字的地址位置之间的距离
而求平均数的除数,是模的大小
因为失败查找次数是针对位置查找,因为模为11,所以查找的位置(哈希函数的值)为0-10(共11个),针对这11个位置进行查找,而与表的长度无关。
理清了思路,我们来看看链地址法表示的哈希表:
成功时的平均查找长度很好求,针对表中的每个关键字:有五个关键字找一次:4,12,49,13,32;三个关键字找两次:38,24,21.
失败时的平均查找长度针对位置来查找:
等于0时,只有空指针域,查找1次;
等于1时,带一个结点,所以查找2次找到空指针;
…
等于4时,带两个节点,所以查找3次找到空指针;
…
综上所述,我们可以总结:
失败查找次数就是当前位置所带的结点个数+1
使用链地址法查找时无二次聚集现象(二次聚集:处理冲突过程中发生的两个第一个散列地址不同的记录争夺同一个后继散列地址的现象)
除数也是模的大小
你学会了吗?