散列表

散列表

散列函数

  • 除法散列法

    \[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-α}\)

posted @ 2021-01-03 15:46  余快  阅读(129)  评论(0编辑  收藏  举报