首先,先介绍一个新的参数 :装填因子(load factor)λ=散列表中元素的个数/散列表的大小。
表的平均长度为λ,则不成功的查找需要的时间为λ,而成功的查找需要1+λ/2。
之后再对分离链接法的缺点进行梳理总结。
一、该方法需要语言支持指针。
二、由于指针的存在,对指针所指向的空间的分配地址需要时间。
因此,出现了一种仅由数组实现的方法:开放地址法。此方法即在冲突发生时,通过函数hi(X)=(Hash(X)+F(i))mod TableSize将新插入的元素的放到一个新的空位上。可以看到与之前的Hash(X) mod TableSize相比较,多出的一项时与hi(X)有关的F(i),这表明即是是对同一个X,i不同,所对于的F(i)也会发生变化。进一步,其表明了F(i)函数可能不会一次性解决冲突,而是需要多次计算来找到一个空位。
之后,F(i)的函数形式值得我们去思考。我们该如何设计这个函数,从而使得尝试的次数尽可能较少,进而减少运行的时间。
一、线性探测法。即F(i)=i。
这种方法即在发生冲突时,将存放新元素的位置向下一个位置移动,若再次发生冲突,则再次移动。
函数形式为:hi(X)=(Hash(X)+i)mod TableSize;
可以考虑到,在i<TableSize的情况下,原函数等价于hi(X)=Hash(X) mod TableSize +i ;即对于计算的地点,向下移动i个位置。
这种方法带来的缺点也是显而易见的。若插入的元素之间容易发生冲突,则