在发生碰撞之前,您可以将多少学生放入哈希表?

时间:2016-06-13 19:53:07

标签: math hash probability hash-collision birthday-paradox

我的教授在解释Hash Collision概率时给了我们这张幻灯片:

enter image description here

当我在“生日悖论”中查找两个人生日相同的概率时,我在Wikipedia and other sources上发现n = 10时的概率应该是11.7。事实上,我使用他的公式找到和计算的每一个值都与教授的幻灯片不同。

所以我的问题是:当他问“在发生碰撞之前我们可以在我们的桌子上放入多少学生”时,这与计算任何2名学生生日相同的概率有所不同吗?

如果是这样,那有什么公式吗?

或者他的幻灯片是错的?

4 个答案:

答案 0 :(得分:1)

如有疑问,请检查计算结果!

假设所有结果同样可能并且彼此独立,那么您的教师给出的公式确实是正确的。这是一个小C程序,可以打印少数学生的碰撞次数值:

#include <stdio.h>

const int kNumBuckets = 365;
const int kMaxNumber  = 50;

int main() {
  double probability = 1.0;
  for (int i = 1; i <= kMaxNumber; i++) {
    probability *= (double)(kNumBuckets - i + 1) / kNumBuckets;

    if (i % 10 == 0) {
      printf("Collision probability with %2d students: %g\n", i, 1.0 - probability);
    }
  }
  return 0;
}

这是输出:

Collision probability with 10 students: 0.116948
Collision probability with 20 students: 0.411438
Collision probability with 30 students: 0.706316
Collision probability with 40 students: 0.891232
Collision probability with 50 students: 0.970374

这些数字与您的教授不一致,但他们同意维基百科。我将假设这只是教授材料中的一个错误。联系他们并要求澄清可能没什么坏处,因为这可能只是一个诚实的错误。

答案 1 :(得分:0)

我评估了你教授的表达方式。你的好眼睛:我没有得到你发布的价值观。我看到的那些更接近生日问题的结果。你是一个思考的好学生,不接受所有你被告知的。

/**
 * Implement the expression in the question to check.
 * User: mduffy
 * Date: 6/14/2016
 * Time: 8:03 AM
 * @link http://stackoverflow.com/questions/37798077/how-many-students-can-you-put-into-a-hash-table-before-a-collision-occurs
 */
public class CollisionProbability {

    public static void main(String[] args) {
        int m = (args.length > 0) ? Integer.parseInt(args[0]) : 365;
        int nMin = 10;
        int nMax = (args.length > 1) ? Integer.parseInt(args[1]) : 100;
        int dn = (args.length > 2) ? Integer.parseInt(args[2]) : 10;
        for (int n = nMin; n < nMax; n += dn) {
            System.out.println(String.format("m=%d n=%d p(collide)=%f", m, n, p(m, n)));
        }
    }

    public static double p(int m, int n) {
        double p = 1.0;
        for (int i = 1; i < n; ++i) {
            p *= (double)(m-i)/m;
        }
        return 1.0-p;
    }
}

答案 2 :(得分:0)

快速回答:

  

所以我的问题是:当他问“在发生碰撞之前我们可以在桌子上放入多少学生”,这与计算任何2名学生同一个生日的概率不同吗?

不,没有什么不同。第1年至第365年的日子与365个散列桶完全相同,并且可接受的散列函数包含完全随机化的值(在生日问题中也是错误的假设)。

  

如果是的话,是否有一个公式?

当然,维基百科有https://en.wikipedia.org/wiki/Birthday_problem

答案 3 :(得分:0)

我认为你的教授已经完成了他的计算,M = 181或182,即半年。使用这些值运行计算得出

181, 10, 0.22359889333483407
181, 20, 0.6636461635832673
181, 30, 0.9215808021897809
181, 40, 0.9905555232124136
182, 10, 0.2224990010873642
182, 20, 0.6615484583220019
182, 30, 0.9204086626783813
182, 40, 0.9902893472869162