9.4.5 哈希表的查找性能

  以哈希表表示动态查找表原希望其平均查找长度为0,但由于构建哈希表时不可避免会产生冲突,因此在哈希表上进行查找还是需要通过"比较"来确定查找是否成功,因此仍然存在平均查找长度的问题。那么哈希表的平均查找长度是多少?先看一下前面构建好的哈希表的例子。

  假设查找是等概率的,即 =1/9,则
  按线性探测再散列方法处理冲突构建的哈希表的平均查找长度为
   

  按平方探测再散列方法处理冲突构建的哈希表的平均查找长度为
   

  按双散列函数探测再散列方法处理冲突构建的哈希表的平均查找长度为
   

  按链地址方法处理冲突构建的哈希表的平均查找长度为
   

  一般情况下,在哈希函数为"均匀"的前提下,哈希表的平均查找长度仅取决于处理冲突的方法和哈希表的装填因子。
  哈希表的装填因子定义为:
   

  在等概率查找的情况下,可以证明:
  线性探测再散列的哈希表查找成功的平均查找长度为
   

  随机(或平方)探测再散列的哈希表查找成功的平均查找长度为
   

  链地址处理冲突的哈希表查找成功的平均查找长度为
   
 
  由此可见,由于哈希表的平均查找长度不是 n 的函数,而是α的函数,因此虽然不能做到平均查找长度为0,但可以设计一个哈希表,使它的平均查找长度控制在一个期望值之内。

  最后要说明的一点是,对开放定址的哈希表不能随意删除表中记录,而必须在该记录所在位置作一特殊标记,同时需修改前述查找算法添加识别已被删除记录。
   
 动画
 
 从例子可以得出下列结论:
 1)在哈希函数相同的情况下,处理冲突的方法不同,所得哈希表的平均查找长度也不同。

 2)线性探测再散列处理冲突容易造成记录的"二次聚集",即使得本不是同义词的关键字又产生新的冲突;

 3)对开放定址处理冲突的哈希表而言,表长必须≥记录数,并且由于表中已填入的记录越多,继续插入记录发生冲突的可能性就越大,因此可以设想这样的哈希表不应该使"表长=记录数"。而链地址处理冲突的哈希表不会出现这种情况,它的平均查找长度主要取决于哈希函数本身。设想若表长仍取11,哈希函数和开放定址的一样,则链地址处理冲突的哈希表的平均查找长度为18/9。
 
 
 
 
 
 
 


  从证明所得结论也可以看出,开放定址的哈希表的装填因子必定< 1,且不能接近于1,而链地址的哈希表的表长可以>1。