预期的哈希冲突数

num*_*gil 11 python hash collision

我觉得我已经过度思考这个问题,但无论如何......

我有一个哈希表,其内部数组有M个插槽.我需要在哈希表中插入N个元素.假设我有一个哈希函数,它将am元素随机地插入到每个槽的概率相等的槽中,那么哈希冲突总数的预期值是多少?

(对不起,这是一个数学问题,而不是编程问题).

编辑:这是我必须使用Python模拟它的一些代码.我正在得到数字答案,但在将其推广到公式并解释它时遇到了麻烦.

import random
import pdb

N = 5
M = 8

NUM_ITER = 100000

def get_collisions(table):
    col = 0
    for item in table:
        if item > 1:
            col += (item-1)
    return col

def run():
    table = [0 for x in range(M)]

    for i in range(N):
        table[int(random.random() * M)] += 1

    #print table
    return get_collisions(table)

# Main

total = 0
for i in range(NUM_ITER):
    total += run()

print float(total)/NUM_ITER
Run Code Online (Sandbox Code Playgroud)

小智 22

你会在这里找到答案:Quora.com.m个桶和n个插入件的预期碰撞次数是

n - m * (1 - ((m-1)/m)^n).

  • 在 [the Math StackExchange](http://math.stackexchange.com/questions/35791/birthday-problem-expected-number-of-collisions) 上也有一个证明。 (2认同)
  • 答案应包括证明。 (2认同)
  • 恕我直言,碰撞次数与共享相同桶/槽的元素数量不同.在B'day悖论的背景下,如果4个人共享相同的B'day,那么回答后一个问题(共享相同B'day的人的#)将是4.但是,对于前一个问题,B的#'白天碰撞通常被认为是4-1 = 3.这背后的理由是,如果没有四个人中的任何三个,就没有碰撞.差异很小,但值得注意,以免混淆. (2认同)