2012-02-01 13 views
9

czuję jakbym sposób overthinking ten problem, ale tu idzie tak ...Przewidywana liczba kolizji hash

Mam tabeli mieszania ze szczelinami M w swojej wewnętrznej tablicy. Potrzebuję wstawić N elementów do tabeli mieszania. Zakładając, że mam funkcję skrótu, która losowo wstawia element am do slotu z równym prawdopodobieństwem dla każdego boksu, jaka jest oczekiwana wartość całkowitej liczby kolizji mieszania?

(Niestety, jest to raczej pytanie matematyczne niż pytanie dotyczące programowania).

Edytuj: Oto kod, który muszę zasymulować za pomocą Pythona. Otrzymuję odpowiedzi numeryczne, ale mam problem z uogólnieniem go do formuły i wyjaśnieniem.

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 
+0

Jak mierzyć kolizje "trójki"? – wildplasser

+0

Cokolwiek ma największy sens, tak myślę. Więc liczę to jako dwie kolizje (jedna na każdy nowy element dodany po pierwszym) – numegil

+0

Najlepszą miarą wydaje się ilość pracy do odzyskania wszystkich pozycji, czyli SUM (x * (x + 1)/2) 'with X to liczba elementów w wiadrze, a suma jest nad wszystkimi zasobnikami. – wildplasser

Odpowiedz

19

Znajdziesz tu odpowiedź: Quora.com. Oczekiwana liczba kolizji na m wiadra i n wkładek jest

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

+1

+1 dla odniesienia do źródła. – lumberjack4

+1

Istnieje również dowód na to [the Math StackExchange] (http://math.stackexchange.com/questions/35791/birthday-problem-expected-number-of-collisions). – ShreevatsaR

+0

Odpowiedź powinna zawierać dowód. – MVTC

0

Formuła SUM(x*(x+1)/2) metryki można znaleźć here i wartość oczekiwana W wydaje (n/2m)* (n+2m -1).

Nie wiem o wariancji, IANAM.