哈希表

时间:2017-05-01 07:47:28

标签: math hash probability

当将n个项目插入到大小为m的哈希表中时,假设每个项目的目的地是独立均匀随机的,那么没有发生冲突的概率是多少?

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

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

然后,对于任何给定的位置,对于所有对,上述情况的概率为((m-1)/ m)^(nC2)。

然后,对每个位置都是这样的概率是 [((M-1)/ M)^(NC2)] ^(M)。

1 个答案:

答案 0 :(得分:0)

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

这是一种直接找到所需概率的方法。考虑忽略碰撞的总体可能性,n个项目中的每一个都有很多可以去的地方。这些展示位置是独立的,因此如果我们考虑到订单,总的可能性是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的多种选择,并且它可以解决。