【问题标题】:The hash table probability哈希表概率
【发布时间】:2023-03-03 10:35:01
【问题描述】:
【问题讨论】:
标签:
hash
hashtable
probability
【解决方案1】:
需要在哈希表中插入多少元素,才能使下一个元素发生碰撞的概率超过 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%”(强调我的)。