我仍然混淆了如何查找哈希表概率。我有大小为20的哈希表,开放寻址使用哈希函数
hash(int x)= x%20
需要在哈希表中插入多少个元素,以便下一个元素碰撞的概率超过50%。
我使用生日悖论的关注来找到它https://en.wikipedia.org/wiki/Birthday_problem,似乎得到了错误的答案。我的错误在哪里? calculating
1/2 = 1-E ^( - N ^ 2 /(2 * 20)) LN(1/2)= LN(E)*( - N ^ 2/40) -0.69314718 = -n ^四十〇分之二 N = SCR(27.725887)= 5.265538
答案 0 :(得分:0)
需要在哈希表中插入多少个元素,以便下一个元素碰撞的概率超过50%。
嗯,这取决于一些事情。
简单的情况是,您已经使用不同且有效的随机整数键执行了11个插入,这样就可以使用11个存储桶,并且您的下一个插入使用另一个不同且有效的随机键,因此它将进行哈希处理对于任何具有相同概率的铲斗:显然只有9/20的机会未使用该铲斗,这意味着在第12次插入时碰撞的可能性首次超过50%。这是大多数公式,教科书,人等都会给你的答案,因为它对于哈希表与强散列函数和/或素数桶等一起使用的情况最有意义 - 哈希的场景桌子闪耀,特别优雅。
另一个不常见的情况是,您将业务的客户ID称为哈希表,并且您从1开始为客户分配递增ID号。即使您已经已经插入了带有ID 1到19的客户,你知道他们在没有冲突的桶[1]
到[19]
中 - 你的哈希只是传递了密钥而没有使用mod。你可以插入客户20进入桶[0]
(在mod操作之后)没有碰撞。然后,第21位客户有100%的碰撞机会。 (但是,如果您的数据是这样的,请使用客户ID直接使用数组和索引,如果您不想浪费存储桶[0],请使用customer_id - 1。)
当你超过50%的碰撞概率时,钥匙中还有许多其他可能的模式会影响:例如:所有的键都是奇数或某个值的倍数,或者说具有特定分布曲线的年龄或高度。
你使用生日悖论的错误是认为它回答了你的问题。当你把" 1/2"和" 20"在公式中,它告诉您 累积 碰撞概率达到1/2的点,但您的问题是" 下一个 元素碰撞碰撞的概率超过50%" (强调我的)。