Esercizio - Liste di collisione con hash universale e dimensionamento della tabella
Teoria: Hashing randomizzato - famiglie universali, filtri di Bloom e fingerprintHashing con catene e costo atteso 1+alfa; famiglie universali (probabilità di collisione al più 1/m) e costruzione h(x)=((ax+b) mod p) mod m con dimostrazione; hashing perfetto a due livelli (spazio lineare, ricerca O(1) nel caso peggiore); filtri di Bloom: falsi positivi (1-e^(-kn/m))^k e k ottimo (m/n) ln 2; fingerprint di stringhe e numero di bit necessari.Hashing randomizzato - famiglie universali, filtri di Bloom e fingerprint → (catene e costo atteso, lista più lunga), Tabelle hashTabella hash per implementare una mappa: funzione hash = hash code + compression function, bucket array, separate chaining; hash code per numeri e stringhe (polynomial, cyclic shift), division e MAD; load factor, complessità al caso pessimo Theta(n) e medio O(1+lambda), rehashing; esempio svolto con inserimenti e collisioni.Tabelle hash →, Linearità del valore atteso e variabili indicatriciLa linearità $E[X+Y]=E[X]+E[Y]$ vale sempre, anche senza indipendenza; con le variabili indicatrici ($E[I_A]=P(A)$) trasforma un conteggio in una somma di probabilità. Applicazioni: attesa del primo successo $1/p$, collezionista di figurine $nH_n$, punti fissi di una permutazione (media $1$), record (media $H_n$), inversioni ($n(n-1)/4$), attesa condizionata, identità di Wald $E[S_N]=E[N]E[X]$.Linearità del valore atteso e variabili indicatrici →.
Testo. Una tabella hash con liste di collisione ha bucket e usa con e scelti uniformemente a caso. Si inseriscono chiavi distinte (qualunque, anche scelte da un avversario che conosce la famiglia ma non ).
- Con , : calcolare il limite sulla lunghezza attesa della lista che contiene una chiave presente e il numero atteso di coppie di chiavi in collisione. Dare un limite per .
- Quanto deve essere grande perché la ricerca riuscita costi in media al più confronti e quella non riuscita al più (cioè )?
- Con dimostrare che con probabilità almeno la lista più lunga ha meno di elementi (usando solo l'universalità).
- Verificare con una simulazione le risposte ai punti 1 e 3 e commentare lo scarto tra il limite del punto 3 e i valori osservati.
Soluzione
1. Lunghezza attesa. Sia presente. Gli indicatori se , per ( chiavi), hanno per l'universalità: la lista di ha in media al più elementi (la chiave stessa più i colliders). Senza ipotesi di indipendenza: basta la linearità. Le coppie in collisione attese sono . Per Markov sulla lunghezza dà . Con una funzione ideale le altre chiavi nella lista sarebbero , e servirebbero almeno altre chiavi: : l'universalità, controllando solo la media e le coppie, non dà code così sottili.
2. Dimensionamento. Ricerca riuscita: . Ricerca non riuscita: . Basta (con e costo riuscito ). Scegliere costa quindi memoria doppia rispetto a , per il costo quasi minimo.
3. Lista più lunga. Se una lista ha elementi contiene coppie in collisione, quindi Con , : . Quindi con probabilità nessuna lista ha o più elementi (per è l'ordine del teorema). Altri valori: dà (vuoto), dà .
4. Simulazione. Per ogni prova si scelgono a caso e chiavi casuali a bit.
- , ( prove): lunghezza media della lista della prima chiave (limite ), lista più lunga in media , massimo osservato .
- ( prove): lunghezza media (limite ), lista più lunga in media ; vale nello dei casi e mai .
Il limite (vale a ) è molto pessimista rispetto al valore tipico -, vicino a più costante, che si avrebbe con una funzione completamente casuale (Palline e urne - compleanno, carico massimo e approssimazione di PoissonModello palline e urne (m palline, n urne, scelte indipendenti e uniformi): paradosso del compleanno con soglia sqrt(2 n ln 2), urne vuote attese n e^(-m/n), carico massimo ln n / ln ln n con dimostrazione (first moment e union bound), approssimazione di Poisson con il fattore e sqrt(m), potere delle due scelte (ln ln n / ln 2).Palline e urne - compleanno, carico massimo e approssimazione di Poisson →). Il valore è invece quasi esatto: l'universalità basta per il costo medio, non per il caso peggiore.
Codice di verifica
import random
from collections import Counter
P = (1 << 61) - 1
def prova(n, m):
a, b = random.randrange(1, P), random.randrange(P)
chiavi = random.sample(range(1 << 40), n)
cont = Counter(((a * k + b) % P) % m for k in chiavi)
x = chiavi[0]
return cont[((a * x + b) % P) % m], max(cont.values())
random.seed(1)
for n, m in ((2000, 1000), (1000, 1000)):
r = [prova(n, m) for _ in range(4000)]
print(n, m, sum(x for x, _ in r) / len(r), sum(y for _, y in r) / len(r),
max(y for _, y in r), 1 + (n - 1) / m)Risultato (4000 prove con seed(1)): 2000 1000 2.99675 7.91475 13 2.999 e 1000 1000 1.9995 5.52125 9 1.999.
Versione ripasso
- Lunghezza attesa. presente: , , linearità: per , (Linearità del valore atteso e variabili indicatriciLa linearità $E[X+Y]=E[X]+E[Y]$ vale sempre, anche senza indipendenza; con le variabili indicatrici ($E[I_A]=P(A)$) trasforma un conteggio in una somma di probabilità. Applicazioni: attesa del primo successo $1/p$, collezionista di figurine $nH_n$, punti fissi di una permutazione (media $1$), record (media $H_n$), inversioni ($n(n-1)/4$), attesa condizionata, identità di Wald $E[S_N]=E[N]E[X]$.Linearità del valore atteso e variabili indicatrici →). Coppie in collisione attese . Markov: (funzione ideale: ).
- Dimensionamento. Riuscita ; non riuscita : ().
- Lista più lunga (). elementi coppie; : per , , quindi lista con probabilità (); : (vuoto).
- Simulazione. , : media , massimo medio (osservato ); : media , massimo medio , nello . Media quasi esatta, caso peggiore pessimista.
- Errori tipici. Pretendere code esponenziali dalla sola universalità; dimenticare la chiave stessa nel ; scambiare ricerca riuscita e non riuscita ( contro ).