链式哈希表查找的预期最坏情况时间复杂度?

时间:2012-05-14 05:38:05

标签: math data-structures hash big-o probability

当使用良好的散列函数实现散列表时(任何两个元素碰撞的概率为1 / m,其中m是桶的数量),众所周知,平均情况下的运行时间为查找元素是Θ(1 +α),其中α是负载因子。但是,最坏情况下的运行时间是O(n),如果所有元素最终放入同一个桶中。

我最近在哈希表上做了一些阅读,发现this article声称(第3页)如果α= 1,预期最坏情况复杂度为Θ(log n / log log n)。通过“预期的最坏情况复杂性”,我的意思是,在期望的情况下,如果元素通过统一散列函数分发,则必须完成的最大工作量。这与实际的最坏情况不同,因为最坏情况的行为(同一个桶中的所有元素)实际上不太可能发生。

我的问题如下 - 作者似乎暗示不同的α值可以改变查找的预期最坏情况复杂性。有没有人知道某个公式,表格或文章,讨论如何改变α改变预期的最坏情况运行时间?

2 个答案:

答案 0 :(得分:3)

对于固定α,预期的最差时间始终为Θ(log n / log log n)。但是,如果您将α设为n的函数,那么预期的最差时间可能会发生变化。例如,如果α = O(n),那么预期的最差时间是O(n)(这是你有一个固定数量的哈希桶的情况)。

通常,项目分配到桶中大致是泊松分布,具有i项的随机桶的概率为αi e / i!。最糟糕的情况是接近独立观察的m中最差的m'。 (并非完全独立,但非常接近它。)m观察中m'最差的事件往往是发生的几率约为1/m次。 (更确切地说,分布由Β分布给出,但对于我们的分析1/m已经足够了。)

当你进入泊松分布的尾部时,i!项的增长主导其他所有项,因此高于给定i的所有项的累积概率小于选择i的概率。 1}}本身。因此,通过求解得出一个很好的近似值,你可以找出预期值:

αi e-α / i! = 1/m = 1/(n/α) = α/n

记录双方的日志,我们得到:

i log(α) - α - (i log(i) - i + O(log(i)) = log(α) - log(n)
log(n) - α = i log(i) - i - i log(α) + O(log(i))

如果我们保持α不变,那么这就是:

log(n) = i log(i) + O(i)

如果i的格式为k log(n) / log(log(n)) k = Θ(1),那么这可行吗?我们来试试吧:

log(n) = (k log(n) / log(log(n))) (log(k) + log(log(n)) - log(log(log(n)))) + O(log(log(n)))
       = k (log(n) + o(log(n)) + o(log(n))

然后我们得到更清晰的估计,对于任何固定的平均负载α,预期的最差时间为(1 + o(1)) log(n) / log(log(n))

答案 1 :(得分:1)

经过一番搜索后,我遇到了this research paper,它完整地分析了一大堆不同类型的哈希表的预期最坏情况行为,包括链式哈希表。作者给出了一个答案,即预期长度约为Γ -1 (m),其中m是桶的数量,Γ是Gamma function。假设α是常数,则大约为1 m / ln ln m。

希望这有帮助!