【问题标题】:Expected number of hash collisions预期的哈希冲突次数
【发布时间】:2012-02-24 15:29:38
【问题描述】:

我觉得我想多了这个问题,但无论如何……

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

(抱歉,这更像是一道数学题,而不是编程题)。

编辑: 这是我必须使用 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

【问题讨论】:

  • 您希望如何测量“三重”碰撞?
  • 我猜最有意义的。所以我会把它算作两次碰撞(在第一次之后添加的每个新元素一个)
  • 最好的衡量标准似乎是检索所有项目的工作量,即SUM(x * (x+1) /2),其中 X 是存储桶中项目的数量,总和是所有存储桶的总和。

标签: python hash collision


【解决方案1】:

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

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

【讨论】:

  • the Math StackExchange 上也有一个证明。
  • 答案应包括证明。
  • 是否有可用于通用 m 值(例如 2^32)的表?
  • 恕我直言,冲突的数量与共享相同存储桶/槽的元素数量不同。在 B'day 悖论的背景下,如果 4 人共享相同的 B'day,则后一个问题(共享相同 B'day 的人的数量)的答案将为 4。但是,对于前一个问题,B'的 #天碰撞通常被认为是4-1=3。这背后的基本原理是,没有四个人中的任何三个,就没有碰撞。差异很小,但值得注意,以免混淆。
  • 有没有办法显示碰撞次数的方差?
【解决方案2】:

SUM(x*(x+1)/2) 指标的公式可以在 here 中找到,预期值似乎是 (n/2m)* (n+2m -1)

不知道差异,IANAM。

【讨论】:

    猜你喜欢
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2012-05-13
    • 2020-10-21
    • 1970-01-01
    相关资源
    最近更新 更多