1
算法与数据结构  C语言版
1.11.4.4 9.4.4 散列表的查找和分析
9.4.4 散列表的查找和分析

在哈希表上进行查找的过程和哈希造表的过程基本一致。给定K值,根据造表时设定的哈希函数求得哈希地址,若表中此位置上没有记录,则查找不成功;否则比较关键字,若和给定值相等,则查找成功;否则根据造表时设定的处理冲突的方法找下一地址,直至哈希表中某个位置为“空”或者表中所填记录的关键字等于给定值时为止。

从哈希表的查找过程可见:

(1)虽然哈希表在关键字与记录的存储位置之间建立了直接映像,但由于“冲突”的产生,哈希表的查找过程仍然是一个给定值和关键字进行比较的过程。因此,仍需以平均查找长度作为衡量哈希表的查找效率的量度。

(2)查找过程中需和给定值进行比较的关键字的个数取决于下列三个因素;哈希函数、处理冲突的方法和哈希表的装填因子。

哈希函数的“好坏”首先影响出现冲突的频繁程度。但是,对于“均匀的”哈希函数可以假定:不同的哈希函数对同一组随机的关键字产生冲突的可能性相同,因为一般情况下设定的哈希函数是均匀的,则可不考虑它对平均查找长度的影响。

对同样一组关键字,设定相同的哈希函数,则不同的处理冲突的方法得到的哈希表不同。它们的平均查找长度也不同。

容易看出,线性探测再散列在处理冲突的过程中易产生记录的二次聚集,即使哈希地址不相同的记录又产生新的冲突;而链地址法处理冲突不会发生类似情况,因为哈希地址不同的记录在不同的链表中。

在一般情况下,处理冲突方法相同的哈希表,其平均查找长度依赖于哈希表的装填因子。

哈希表的装填因子定义为

∂标志哈希表的装满程度。直观地看,∂越小,发生冲突的可能性就越小;反之,∂越大,表中已填入的记录越多,再填记录时,发生冲突的可能性就越大,则查找时,给定需与之进行比较的关键字的个数也就越多。

由于哈希表在查找不成功时所用比较次数也和给定值有关,则可类似地定义哈希表在查找不成功时的平均查找长度为:和给定值进行比较的关键字个数的期望值。同样可证明,不同的处理冲突方法构成的哈希表查找不成功时的平均查找长度也不同。