Hashing randomizzato - famiglie universali, filtri di Bloom e fingerprint
In questa pagina 6
Una tabella hash (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 →) è veloce in media solo se i dati non sono scelti da un avversario contro la funzione hash. Con un'unica funzione fissa esistono insiemi di chiavi che finiscono tutte nello stesso bucket. Rimedio: scegliere a caso da una famiglia, indipendentemente dai dati. Il costo atteso si calcola sulla scelta di , non sull'input: vale per ogni insieme di chiavi, come per gli algoritmi randomizzati di Algoritmi randomizzati - Monte Carlo, Las Vegas e amplificazioneUn algoritmo randomizzato usa bit casuali indipendenti; la probabilità è sulle scelte dell'algoritmo, mai sull'input (garanzia per ogni input). Las Vegas: sempre corretto, tempo aleatorio (conta il tempo atteso). Monte Carlo: tempo fisso, risposta sbagliata con probabilità limitata; errore unilaterale (RP: accetta solo se x sta nel linguaggio, accetta con prob almeno 1/2) o bilaterale (BPP: giusto con prob almeno 2/3). ZPP = RP ∩ co-RP = Las Vegas con tempo atteso polinomiale. Amplificazione: unilaterale, k ripetizioni indipendenti, errore (1-p)^k ≤ e^(-pk), serve k ≥ ln(1/ε)/p; bilaterale, voto di maggioranza su k esecuzioni, errore binomiale esatto, esponenziale in k (Chernoff, e^(-k/18) per p=2/3) mentre Chebyshev dà solo 8/k. Las Vegas -> Monte Carlo: interrompere a c volte il tempo atteso (Markov, errore ≤ 1/c). Monte Carlo -> Las Vegas: solo se la risposta si verifica in fretta. Esempio: Miller-Rabin, errore ≤ 1/4 per esecuzione.Algoritmi randomizzati - Monte Carlo, Las Vegas e amplificazione →. Prerequisiti: 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 →, 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 →.
Catene e costo atteso
Si memorizzano chiavi in bucket, ognuno con una lista (separate chaining). Il fattore di carico è . Se fosse una funzione veramente casuale ( uniforme e indipendente per ogni , cioè il modello palline e urne) la ricerca di una chiave assente confronterebbe in media elementi (la lunghezza media di una lista), una ricerca riuscita . Ma una funzione casuale da un universo a richiede bit per essere memorizzata: inutilizzabile. Serve una famiglia piccola che dia la stessa garanzia sulle coppie di chiavi, che è tutto ciò che interessa per i confronti.
Famiglie universali
Definizione (famiglia universale). Una famiglia di funzioni è universale se per ogni coppia di chiavi , scegliendo uniformemente a caso,
È la probabilità di collisione di una funzione casuale ideale, richiesta solo per le coppie.
Teorema (catene). Sia universale, un insieme di chiavi e scelta a caso. Per una chiave il numero atteso di chiavi di nel suo bucket è al più se e se . Quindi ricerca, inserimento e cancellazione costano in media .
Dimostrazione. Gli indicatori se , con : per la definizione. Per la linearità (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 →), senza alcuna ipotesi di indipendenza, . Con la chiave stessa la lista ha elementi.
Lista più lunga. Se chiavi cadono nello stesso bucket, ci sono coppie in collisione; il numero atteso di coppie in collisione è . Con per Markov , che per vale circa . La sola universalità garantisce quindi liste massime ; per il del modello ideale servono famiglie con più indipendenza (fuori programma).
La famiglia
Teorema (costruzione). Siano un primo con , chiavi e, per , , La famiglia , di funzioni, è universale.
Dimostrazione. Fissate . Si pone e . (1) : altrimenti , impossibile perché è primo e né né sono multipli di . (2) La mappa è una biiezione tra le coppie e le coppie ordinate con (si risolve il sistema lineare in : , ), quindi scegliere a caso equivale a scegliere a caso con . (3) Si ha collisione se . Per ogni i valori con sono al più (i valori di nella stessa classe di resto di sono al più , tolto stesso). Dunque le coppie in collisione sono al più su : probabilità .
Esempio (, , , ). .
| mod | mod | ||
|---|---|---|---|
Collidono e (bucket ) e e (bucket ): su chiavi in bucket è inevitabile (principio dei cassetti). Verifica esaustiva con tutte le funzioni: per , la coppia collide in funzioni su () e il caso peggiore su tutte le coppie è ; per , il caso peggiore è . Il limite non è stretto ma regge sempre.
Per chiavi più grandi di (stringhe, interi a bit) si usa primo maggiore dell'universo, per esempio il primo di Mersenne nel codice sotto. La variante con e senza il finale è a coppie indipendente: è uniforme su , quindi vale anche .
Hashing perfetto (statico, due livelli)
Per un insieme fisso di chiavi si vuole una ricerca in tempo nel caso peggiore con spazio .
Algoritmo (due livelli).
- Primo livello. Si sceglie con bucket; il bucket contiene chiavi. Si ripete finché .
- Secondo livello. Per ogni bucket con si sceglie da una famiglia universale su celle, ripetendo finché è priva di collisioni sulle chiavi del bucket.
- Ricerca di : si calcola e si guarda la cella del bucket : due accessi.
Analisi. Secondo livello: con il numero atteso di coppie in collisione è , quindi per Markov : servono in media meno di tentativi. Primo livello: con = numero di coppie in collisione, perché e . Con : , quindi . Per Markov : anche qui meno di tentativi. Lo spazio è : lineare.
Esempio (, , ). Primo livello : ; ; ; ; ; ; ; . Bucket: , , , , , gli altri vuoti. . Secondo livello con : bucket ha e le posizioni , tutte diverse; bucket ha e , . I bucket singoli usano una cella. Spazio totale celle per chiavi.
Filtri di Bloom
Definizione (filtro di Bloom). Un vettore di bit, inizialmente , e funzioni hash . Inserimento di : si pongono a i bit . Interrogazione di : si risponde "presente" se tutti i bit sono , "assente" altrimenti.
Nessun falso negativo: un elemento inserito ha i suoi bit a per sempre. Può esserci un falso positivo: un elemento mai inserito i cui bit sono stati posti a da altri. Non si possono cancellare elementi (si userebbe un vettore di contatori). Occupa bit indipendentemente dalla lunghezza delle chiavi.
Teorema (falsi positivi). Dopo inserimenti, con funzioni indipendenti e uniformi,
- un bit specifico è ancora con probabilità ;
- un elemento non inserito è un falso positivo con probabilità .
- Per fissati è minima per , e vale allora .
Dimostrazione. Un bit non viene toccato da una data scelta con probabilità , e ci sono scelte indipendenti (da cui il primo punto, con ). Sia la frazione attesa di bit a . L'elemento è un falso positivo se tutti i suoi bit sono : (le posizioni nel filtro sono quasi indipendenti; la formula esatta sulla posizione dei bit è un po' più grande ma la differenza è trascurabile per grande). Per ottimizzare si scrive e Il prodotto è simmetrico in e ha l'unico punto di massimo in , dove vale . Quindi è minimo per , cioè per , , e , cioè . Con ottimo metà dei bit è a .
Dimensionamento. Dal ottimo si ricava bit per elemento: per , per , per . Ogni bit in più per elemento moltiplica i falsi positivi per .
Esempio (, ). Con (): ; una simulazione con interrogazioni dà e una frazione di bit a pari a (attesa ). Con sarebbe , con , con : il minimo è piatto e un intero vicino a basta.
| ottimo (intero) | ||
|---|---|---|
Uso tipico: filtro davanti a un archivio lento, che si interroga solo se il filtro risponde "presente".
Fingerprint
Definizione (fingerprint). Una fingerprint di bit di un oggetto grande è con scelta a caso; si usa come test (probabilistico) per . Se le fingerprint coincidono sempre; se possono coincidere per caso (errore unilaterale, Algoritmi randomizzati - Monte Carlo, Las Vegas e amplificazioneUn algoritmo randomizzato usa bit casuali indipendenti; la probabilità è sulle scelte dell'algoritmo, mai sull'input (garanzia per ogni input). Las Vegas: sempre corretto, tempo aleatorio (conta il tempo atteso). Monte Carlo: tempo fisso, risposta sbagliata con probabilità limitata; errore unilaterale (RP: accetta solo se x sta nel linguaggio, accetta con prob almeno 1/2) o bilaterale (BPP: giusto con prob almeno 2/3). ZPP = RP ∩ co-RP = Las Vegas con tempo atteso polinomiale. Amplificazione: unilaterale, k ripetizioni indipendenti, errore (1-p)^k ≤ e^(-pk), serve k ≥ ln(1/ε)/p; bilaterale, voto di maggioranza su k esecuzioni, errore binomiale esatto, esponenziale in k (Chernoff, e^(-k/18) per p=2/3) mentre Chebyshev dà solo 8/k. Las Vegas -> Monte Carlo: interrompere a c volte il tempo atteso (Markov, errore ≤ 1/c). Monte Carlo -> Las Vegas: solo se la risposta si verifica in fretta. Esempio: Miller-Rabin, errore ≤ 1/4 per esecuzione.Algoritmi randomizzati - Monte Carlo, Las Vegas e amplificazione →).
Quanti bit. Con oggetti distinti e fingerprint a bit non devono esserci due collisioni: è il compleanno con urne (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 →), e per l'union bound Per documenti e probabilità di errore serve , cioè bit ( dà ). Con l'errore è ; con la collisione è praticamente certa.
Fingerprint di una stringa. Per e primo si sceglie a caso e si pone (valutazione in del polinomio che ha come coefficienti i caratteri). Se della stessa lunghezza , è un polinomio non nullo di grado che ha al più radici in , quindi (lemma di Schwartz-Zippel in una variabile, Union bound e verifica randomizzata - identità polinomiali e prodotti di matriciSpazi discreti richiamati; inclusione-esclusione (con le troncate di Bonferroni) e union bound Pr[unione] ≤ somma, valido senza indipendenza e stretto quando gli eventi sono rari (collisioni: C(n,2)/m). Principio delle decisioni differite: si fissa tutto tranne una scelta casuale e si limita la probabilità su quella. Lemma di Schwartz-Zippel: un polinomio non nullo di grado totale d, valutato in un punto di S^n scelto uniformemente, si annulla con prob ≤ d/|S| (induzione sul numero di variabili); test di identità polinomiale con errore unilaterale, ripetuto (d/|S|)^k. Freivalds: per verificare AB=C si controlla A(Br)=Cr con r in {0,1}^n in tempo O(n^2), errore ≤ 1/2 (stretto), 2^-k con k prove. Fingerprint: due stringhe di n bit si confrontano con a mod p per un primo casuale p ≤ M, errore ≤ n/π(M).Union bound e verifica randomizzata - identità polinomiali e prodotti di matrici →). Per e : .
import random
from math import log
P = (1 << 61) - 1 # primo di Mersenne, maggiore di ogni chiave
def scegli_hash(m):
"""Un elemento a caso della famiglia h(x) = ((a x + b) mod P) mod m."""
a, b = random.randrange(1, P), random.randrange(P)
return lambda x: ((a * x + b) % P) % m
class Bloom:
def __init__(self, m, k):
self.m, self.bits = m, bytearray(m)
self.h = [scegli_hash(m) for _ in range(k)] # k funzioni indipendenti
def aggiungi(self, x):
for h in self.h:
self.bits[h(x)] = 1
def contiene(self, x): # False: certamente assente
return all(self.bits[h(x)] for h in self.h) # True: forse presente
if __name__ == "__main__":
n, eps = 10_000, 0.01
m = round(n * log(1 / eps) / log(2) ** 2) # m/n = 1,44 log2(1/eps)
k = round(m / n * log(2))
f = Bloom(m, k)
dentro = [random.getrandbits(60) for _ in range(n)]
for x in dentro:
f.aggiungi(x)
falsi = sum(f.contiene(random.getrandbits(60)) for _ in range(100_000))
print(m, k, all(f.contiene(x) for x in dentro), falsi / 100_000)Con e il programma usa bit e e osserva una frequenza di falsi positivi di circa (quattro esecuzioni: da a ), senza nessun falso negativo.
Domande d'esame
- Dimostra che la famiglia è universale. Per la mappa è una biiezione sulle coppie con ; per ogni ci sono al più valori con ; quindi la probabilità è .
- Una tabella con chiavi in bucket e hash universale: lunghezza attesa della lista di una chiave presente? Al più , per linearità degli indicatori di collisione.
- Perché nell'hashing perfetto il secondo livello usa celle e il primo si accetta se ? Con celle le coppie in collisione attese sono , quindi un tentativo riesce con probabilità ; e per Markov con probabilità ; spazio totale .
- Un filtro di Bloom con bit per elemento: ottimo e tasso di falsi positivi? e .
Versione ripasso
- Idea. Con una sola funzione fissa esistono input pessimi (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 →); si sceglie a caso da una famiglia piccola e il costo atteso vale per ogni insieme di chiavi. Una funzione veramente casuale richiede bit, inutilizzabile: basta controllare le coppie di chiavi.
- Universale. per . Catene: gli indicatori hanno ; per linearità, senza indipendenza (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 →), la lista di ha in media elementi se e se : costo . Lista massima con : coppie in collisione attese , quindi per : solo .
- Costruzione. , primo , , . Dimostrazione: perché ; è una biiezione sulle coppie con (); per ogni i valori con sono al più ; probabilità . Con e senza la famiglia è a coppie indipendente. Esempio , , , : , , , . Verifica esaustiva su tutte le funzioni: caso peggiore per , ; per , .
- Hashing perfetto. Primo livello , si riprova finché : ( coppie in collisione), , , Markov . Secondo livello celle: coppie in collisione attese , quindi senza collisioni con probabilità . Ricerca in due accessi, spazio . Esempio , , : bucket , e tre singoli, , celle in tutto.
- Bloom. bit, hash; inserimento pone a i bit, interrogazione richiede tutti . Nessun falso negativo, nessuna cancellazione, spazio indipendente dalla lunghezza delle chiavi. Bit ancora : ; falso positivo ; con si ha , minimo per : , e metà dei bit a . Bit per elemento : per , per , per . Esempio , : (simulazione ); darebbe .
- Fingerprint. bit per oggetti: errore (compleanno, 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 →); e richiedono ( dà ). Per le stringhe con casuale: se il polinomio differenza ha al più radici, errore (Union bound e verifica randomizzata - identità polinomiali e prodotti di matriciSpazi discreti richiamati; inclusione-esclusione (con le troncate di Bonferroni) e union bound Pr[unione] ≤ somma, valido senza indipendenza e stretto quando gli eventi sono rari (collisioni: C(n,2)/m). Principio delle decisioni differite: si fissa tutto tranne una scelta casuale e si limita la probabilità su quella. Lemma di Schwartz-Zippel: un polinomio non nullo di grado totale d, valutato in un punto di S^n scelto uniformemente, si annulla con prob ≤ d/|S| (induzione sul numero di variabili); test di identità polinomiale con errore unilaterale, ripetuto (d/|S|)^k. Freivalds: per verificare AB=C si controlla A(Br)=Cr con r in {0,1}^n in tempo O(n^2), errore ≤ 1/2 (stretto), 2^-k con k prove. Fingerprint: due stringhe di n bit si confrontano con a mod p per un primo casuale p ≤ M, errore ≤ n/π(M).Union bound e verifica randomizzata - identità polinomiali e prodotti di matrici →); per , : .
- Errori tipici. Pretendere indipendenza dove basta la linearità; dimenticare che è il passaggio chiave della dimostrazione; usare non ottimo senza ricalcolare il tasso; credere che il filtro di Bloom conservi le chiavi o permetta la cancellazione.
Esercizi su questo argomento
- Esercizio - Count-Min sketch - tabella a mano e dimensionamento
- Esercizio - Dimensionamento di un filtro di Bloom e fingerprint di documenti
- Esercizio - Famiglia universale mod p mod m - verifica esaustiva e controesempio
- Esercizio - Hashing perfetto a due livelli su otto chiavi
- Esercizio - Impronta di stringhe con un primo casuale e comunicazione
- Esercizio - Liste di collisione con hash universale e dimensionamento della tabella