哈希表中的冲突概率

Posted

技术标签:

【中文标题】哈希表中的冲突概率【英文标题】:Probability of Collisions in Hash Table 【发布时间】:2017-09-28 16:21:11 【问题描述】:

当向大小为m的哈希表中插入n个项目时,假设每个项目的目的地都是独立一致随机的,那么不发生碰撞的概率是多少?


到目前为止我的工作: 我们有 n 个项目和 m 个位置。 每个项目都有 1/m 的机会出现在任何特定位置。 有 nC2 个可能的项目对。 没有冲突的概率是对于每个位置,每对项目都不会散列到该位置的概率。

对于任何给定位置,对于任何给定对,这两个项目没有散列到该位置的概率是 (m-1)/m。

那么,对于任何给定的位置,以上对所有对为真的概率是 ((m-1)/m)^(nC2)。

那么,对于每个位置都是如此的概率是 [((m-1)/m)^(nC2)]^(m).

【问题讨论】:

【参考方案1】:

你在这个推理中犯了一些错误。主要的一个是您假设未散列在一起的对的概率是独立的,因此您可以将它们相乘。你没有证明是这样的,事实上不是这样的。考虑三个元素 a、b 和 c。如果你知道 a 和 b 都不会与 c 发生碰撞,那么它们将被限制在 m-1 个位置而不是最初的 m 个位置,并且它们比你忽略 c 更有可能相互碰撞。

这是找到所需概率的简单方法。看看忽略碰撞的总可能性,n 个项目中的每一个都有 m 个地方可以去。这些展示位置是独立的,所以如果我们考虑顺序,总的可能性是 m^n(或 Python 中的 m**n)。

如果我们知道没有碰撞,那么这 n 个项目是一种从 m 个位置中选择而无需替换的方法。因此,如果我们考虑顺序,就会产生 mPn 可能性——从 m 个选项中选择 n 个项目的方法,无需替换且有顺序(排列)。因此,您想要的概率是

mPn / m^n = (m!) / ((mn)! * m^n) = m/m * (m-1)/m * (m-2)/m * ... * ( m-n+1)/m

最后一个表达式中有 n 个因子。 (这在 MathJax 中会好很多!)您可以选择这三个等效表达式中的哪一个最适合您的目的。

当然,还有其他方法可以提出这些表达方式。最后一个可以被认为是在 m 个插槽中放置 1 个项目的无冲突概率乘以在没有先前冲突的情况下放置第二个项目的条件概率乘以在没有先前冲突时间的情况下放置第三个项目的条件概率......

这些表达式很容易测试。只需选择特定的、小的 m 和 n 值,从这些 m 中生成 n 个项目的所有可能选择,然后找到没有冲突的经验概率。这应该与上面的公式一致。我将把编程语言和编码的选择留给你。毕竟,这是一个编程网站。我只是在 Python 中做了这个,对于 n 和 m 的多个选择,它成功了。

【讨论】:

以上是关于哈希表中的冲突概率的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 glib 处理哈希表中的冲突

哈希表中的查找

hashtable源码解析

在哈希表中查找冲突

真的太重要了,面试出现的概率达到了 99%!!!对于哈希表的知识(建议收藏)

哈希表之三冲突解决