【问题标题】:The hash table probability哈希表概率
【发布时间】:2023-03-03 10:35:01
【问题描述】:

我仍然对如何找到哈希表概率感到困惑。我有大小为 20 的哈希表,开放寻址使用哈希函数

哈希(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^2/40 n=scr(27.725887)=5.265538

【问题讨论】:

    标签: 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%”(强调我的)。

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多