Salta al contenuto
Note per Studenti Esercizio - Hashing perfetto a due livelli su otto chiavi

Esercizio - Hashing perfetto a due livelli su otto chiavi

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 → (hashing perfetto, famiglia ((ax+b) mod p) mod m((ax+b)\bmod p)\bmod m), Momenti e deviazioni - Markov, Chebyshev e mediana randomizzataVar(ΣX_i) = ΣVar + 2ΣCov, e basta l'indipendenza a coppie perché la varianza si sommi. Chebyshev dà code polinomiali (collezionista: P(T ≥ nH_n + cn) ≤ π²/(6c²)); il metodo del secondo momento dà P(X=0) ≤ Var(X)/E[X]². Algoritmo della mediana: campione di n^(3/4) elementi, due estremi d e u a ±√n, ordinamento dei soli elementi tra d e u; fallisce con probabilità ≤ n^(-1/4) ed è Las Vegas con 2n + o(n) confronti.Momenti e deviazioni - Markov, Chebyshev e mediana randomizzata → (disuguaglianza di Markov).

Testo. Si vuole una tabella statica per l'insieme di chiavi S={5,17,29,41,48,62,73,90}S=\{5,17,29,41,48,62,73,90\} con ricerca in due accessi nel caso peggiore. Si usa p=97p=97 e la famiglia ha,b(x)=((ax+b) mod 97) mod m′h_{a,b}(x)=((ax+b)\bmod97)\bmod m' con a∈[1,96]a\in[1,96], b∈[0,96]b\in[0,96] (93129312 funzioni).

  1. Primo livello (m=n=8m=n=8 bucket): con h(x)=((3x+1) mod 97) mod 8h(x)=((3x+1)\bmod97)\bmod8 calcolare i bucket e ∑ini2\sum_in_i^2. La funzione si accetta se ∑ni2≤4n\sum n_i^2\le4n?
  2. Secondo livello: per ogni bucket con ni≥2n_i\ge2 usare mi=ni2m_i=n_i^2 celle e la funzione hi(x)=((2x+1) mod 97) mod mih_i(x)=((2x+1)\bmod97)\bmod m_i; verificare che non ci siano collisioni.
  3. Calcolare lo spazio totale e descrivere la ricerca di 7373, di 6262 e di una chiave assente, 100100.
  4. Calcolare esattamente (su tutte le 93129312 funzioni) la media di ∑ni2\sum n_i^2 al primo livello, confrontarla con il limite 2n−12n-1, la frazione di funzioni con ∑ni2≥4n\sum n_i^2\ge4n e la frazione di funzioni di secondo livello senza collisioni sui due bucket.
  5. Per n=106n=10^6 quale spazio e quanti tentativi in media garantisce la teoria?

Soluzione

1. Primo livello. Si calcola 3x+13x+1, poi il resto mod 9797 e mod 88:

xx 3x+13x+1 mod 9797 mod 88
55 1616 1616 00
1717 5252 5252 44
2929 8888 8888 00
4141 124124 2727 33
4848 145145 4848 00
6262 187187 9090 22
7373 220220 2626 22
9090 271271 7777 55

Bucket: 0:{5,29,48}0:\{5,29,48\} (n0=3n_0=3), 2:{62,73}2:\{62,73\} (n2=2n_2=2), 3:{41}3:\{41\}, 4:{17}4:\{17\}, 5:{90}5:\{90\}, vuoti 1,6,71,6,7. ∑ni2=9+4+1+1+1=16≤4n=32\sum n_i^2=9+4+1+1+1=\boxed{16}\le4n=32: accettata.

2. Secondo livello.

  • Bucket 00, m0=9m_0=9: h0(x)=((2x+1) mod 97) mod 9h_0(x)=((2x+1)\bmod97)\bmod9: 5→11→25\to11\to2; 29→59→529\to59\to5; 48→97 mod 97=0→048\to97\bmod97=0\to0. Posizioni 2,5,02,5,0, diverse.
  • Bucket 22, m2=4m_2=4: 62→125 mod 97=28→062\to125\bmod97=28\to0; 73→147 mod 97=50→273\to147\bmod97=50\to2. Posizioni 0,20,2, diverse.
  • Ogni bucket singolo usa mi=1m_i=1 cella.

3. Spazio e ricerca. Primo livello 88 celle di puntatori più 9+4+1+1+1=169+4+1+1+1=16 celle di secondo livello (che contengono le chiavi): 24\boxed{24} celle per 88 chiavi, cioè 3n3n. Ricerca di 7373: h(73)=2h(73)=2, si va al bucket 22 (parametri 2,12,1, m2=4m_2=4), cella h2(73)=2h_2(73)=2: contiene 7373, trovata. Di 6262: bucket 22, cella 00: trovata. Chiave assente 100100: 3⋅100+1=301 mod 97=10→10 mod 8=23\cdot100+1=301\bmod97=10\to10\bmod8=2, bucket 22; h2(100)=201 mod 97=7→7 mod 4=3h_2(100)=201\bmod97=7\to7\bmod4=3: cella 33 vuota, quindi assente. Se la cella fosse occupata si confronterebbe la chiave memorizzata con quella cercata. In ogni caso due accessi: nel caso peggiore, non solo in media.

4. Calcolo esatto sulla famiglia. L'enumerazione delle 93129312 funzioni del primo livello dà: media di ∑ni2\sum n_i^2 pari a 14,49≤2n−1=15\boxed{14{,}49}\le2n-1=15; nessuna funzione ha ∑ni2≥32\sum n_i^2\ge32 (massimo osservato 3030), l'80,1%80{,}1\% ha ∑ni2≤16\sum n_i^2\le16. Per il secondo livello, sui bucket {5,29,48}\{5,29,48\} (mi=9m_i=9) e {62,73}\{62,73\} (mi=4m_i=4) la frazione di funzioni senza collisioni è 32634656=0,701\frac{3263}{4656}=0{,}701 e 147194=0,758\frac{147}{194}=0{,}758, entrambe ≥12\ge\frac12 come prevede il limite: coppie in collisione attese (ni2)/ni2<12\binom{n_i}2/n_i^2<\frac12 e Markov. La media di ∑ni2\sum n_i^2 è vicina a 1515: E[∑ni2]=n+2E[C]≤n+2(n2)1n=2n−1E[\sum n_i^2]=n+2E[C]\le n+2\binom n2\frac1n=2n-1.

5. n=106n=10^6. Il primo livello ha m=nm=n celle e ∑ni2≤4n\sum n_i^2\le4n con probabilità >12>\frac12 (Markov su E≤2n−1E\le2n-1), quindi meno di 22 tentativi; ogni bucket ha successo con probabilità >12>\frac12 (meno di 22 tentativi); lo spazio è ≤n+4n=5⋅106\le n+4n=5\cdot10^6 celle. Il tempo di costruzione atteso è O(n)O(n) operazioni di hashing più le ripetizioni (la somma dei costi dei tentativi sui bucket è O(∑ni2)=O(n)O(\sum n_i^2)=O(n)).

Codice di verifica

python
from collections import Counter

p = 97
S = [5, 17, 29, 41, 48, 62, 73, 90]
def h(a, b, mm, x): return ((a * x + b) % p) % mm

bucket = Counter(h(3, 1, 8, x) for x in S)
print(dict(bucket), sum(c * c for c in bucket.values()))
print([h(2, 1, 9, x) for x in (5, 29, 48)], [h(2, 1, 4, x) for x in (62, 73)], h(3, 1, 8, 100), h(2, 1, 4, 100))

somme = [sum(c * c for c in Counter(h(a, b, 8, x) for x in S).values())
         for a in range(1, p) for b in range(p)]
print(len(somme), sum(somme) / len(somme), max(somme), sum(s >= 32 for s in somme), sum(s <= 16 for s in somme) / len(somme))

for B, mi in (([5, 29, 48], 9), ([62, 73], 4)):
    ok = sum(len({h(a, b, mi, x) for x in B}) == len(B) for a in range(1, p) for b in range(p))
    print(B, ok, (p - 1) * p, ok / ((p - 1) * p))

Risultato: {0: 3, 4: 1, 3: 1, 2: 2, 5: 1} 16; [2, 5, 0] [0, 2] 2 3; 9312 14.4948... 30 0 0.8011... (funzioni, media, massimo, quante con somma ≥32\ge32, frazione con somma ≤16\le16); infine 6526 9312 0.7008... e 7056 9312 0.7577..., cioè le frazioni 32634656\frac{3263}{4656} e 147194\frac{147}{194} del punto 4.

Versione ripasso

Teoria collegata