散列表
散列函数
-
除法散列法
[h(k) = kmod m ]其中k为关键字的自然数表示,m为散列表长度
-
乘法散列法
[h(k) = m(kAmod1) ]其中A为常数0<A<1,即(kAmod1)是取kA的小数部分
开放寻址法
所有元素都存放在散列表中,每个表项或包含一个元素或者为空。当查找某个元素时,要系统的检查所有表项。
-
线性探查
通过一个散列函数h()找到一个初始的表项h(k),如果该位置为空则插入k值,否者探查h(k)+1,直到探查完整个序列;查找时方法类似。优势在于实现简答,但容易出现群集,使得平均查找时间变大。
-
二次探查
找到初始表项h(k),后续探查位置为(h(k)+c_1i+c_2i^2),其中(c_1,c_2)常数,i为(0,1,2...),直到探查整个序列。
探查效果比线性好,但也可能出现群集。
-
双重散列
找到初始表项h(k),后续探查位置为(h(k)+ih_2(k)),其中h2()是另一个散列函数,i为(0,1,2...)。
如果散列函数合适,探查效果最好,其性能非常接近理想的均匀散列!
-
散列分析
假设装载因子为(α<frac nm<1),且是均匀散列的。则对于一次不成功的查找,其期望的探查次数为 $1/(1-α) $ ;插入一个元素期望的探查次数为(1/(1-α));一次成功查找期望次数为(frac1αlnfrac1{1-α})。