散列表
散列表
散列函数
-
除法散列法
\[h(k) = k\mod m \]其中k为关键字的自然数表示,m为散列表长度
-
乘法散列法
\[h(k) = m(kA\mod1) \]其中A为常数0<A<1,即\(kA\mod1\)是取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α\ln\frac1{1-α}\)。