2012-02-01 7 views
9

mi sento come sto modo overthinking questo problema, ma qui va comunque ...Numero previsto di collisioni hash

Ho una tabella hash con slot M nella sua matrice interna. Ho bisogno di inserire N elementi nella tabella hash. Supponendo che disponga di una funzione hash che inserisce casualmente un elemento in uno slot con uguale probabilità per ogni slot, qual è il valore atteso del numero totale di collisioni hash?

(Mi spiace che si tratti più di una questione di matematica che di una domanda di programmazione).

Modifica: Ecco un codice che devo simulare usando Python. Ricevo risposte numeriche, ma ho problemi a generalizzarlo a una formula e a spiegarla.

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

come si desidera misurare le collisioni "triplette"? – wildplasser

+0

Indipendentemente da ciò che ha più senso. Quindi andrò contando come due collisioni (una per ogni nuovo elemento aggiunto dopo il primo) – numegil

+0

La misura migliore sembra essere la quantità di lavoro per recuperare tutti gli elementi, che è 'SUM (x * (x + 1)/2) 'con X è il numero di elementi in un bucket e la somma è su tutti i bucket. – wildplasser

risposta

19

Troverete la risposta qui: Quora.com. Il numero atteso di collisioni per m secchi e n inserti è

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

+1

+1 per referenziare una fonte. – lumberjack4

+1

Ne esiste anche una prova su [Math StackExchange] (http://math.stackexchange.com/questions/35791/birthday-problem-expected-number-of-collisions). – ShreevatsaR

+0

La risposta dovrebbe includere la prova. – MVTC

0

La formula per il SUM(x*(x+1)/2) metrica può essere trovato here, e il valore atteso sembra essere (n/2m)* (n+2m -1).

Non so la varianza, IANAM.

Problemi correlati