【问题标题】:Expected worst-case time complexity of chained hash table lookups?链式哈希表查找的预期最坏情况时间复杂度?
【发布时间】:2012-05-14 05:38:04
【问题描述】:

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

我最近在阅读哈希表时发现 this article 声称(在第 3 页)如果 α = 1,预期最坏情况复杂度为 Θ(log n / log日志 n)。通过“预期的最坏情况复杂性”,我的意思是,根据预期,如果元素由统一的散列函数分布,您将不得不做的最大工作量。这与实际的最坏情况不同,因为最坏情况的行为(同一存储桶中的所有元素)极不可能实际发生。

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

【问题讨论】:

  • 一般分析很复杂(至少对我而言)。我不确定是否有任何关于解决此问题的参考资料,因此可能会进行局部简化。在任何情况下,请注意L 的最大列表长度为max_x l(x),其中l(x) 是槽x 的列表长度(与那里相同的符号)。 l(x) 是伯努利试验的总和,即 l(x) ~ Bin(1/m,n) 具有二项分布。所有这些随机变量的最大值,其中有n,因此是第 n 阶统计量。
  • 互联网上有很多离散顺序统计分布的公式,您可以将一些(相当丑陋的)公式放在一起,或计算各种值的表格。..
  • 我不清楚预期情况(= 平均情况)和预期最坏情况之间的区别。你能解释一下吗?
  • @KonradRudolph- 当然!这样想吧。假设您使用一个好的散列函数将 n 个元素分配到 m 个 bin 中。查找的预期运行时间是您希望在任何一个存储桶中看到的平均对象数(这是 n/m)。预期的最坏情况运行时间是包含最大对象数的桶中的平均元素数。获得此值的一种方法是运行大量试验,将 n 个元素分配到 m 个 bin 中,并在每次试验后计算最填充的桶中有多少元素

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


【解决方案1】:

对于固定的α,预期的最差时间总是Θ(log n / log log n)。但是,如果您将α 设为n 的函数,那么预期的最坏时间可能会改变。例如,如果α = O(n),那么预期的最坏时间是O(n)(这是您拥有固定数量的哈希桶的情况)。

一般来说,项目在桶中的分布近似为泊松分布,随机桶中包含i 项目的几率为α<sup>i</sup> e<sup>-α</sup> / i!。最坏的情况只是m 中最差的m 接近独立观察。 (不完全独立,但相当接近。)在m 观察中,m'th 最差的往往是发生概率约为1/m 次的事情。 (更准确地说,分布由 Β 分布给出,但对于我们的分析,1/m 已经足够好了。)

当您进入 Poisson 分布的尾部时,i! 项的增长支配其他所有内容,因此高于给定i 的所有内容的累积概率小于选择i 本身的概率。因此,您可以通过求解以下问题得出一个很好的近似值:

α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 (日志(日志(n)))
       = k (log(n) + o(log(n)) + o(log(n))

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

【讨论】:

    【解决方案2】:

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      相关资源
      最近更新 更多