Salta al contenuto
Note per Studenti Algoritmi di streaming - campionamento di riserva e conteggio degli elementi distinti

Algoritmi di streaming - campionamento di riserva e conteggio degli elementi distinti

In questa pagina 5

Definizione (modello a flusso). Gli elementi x1,x2,…,xNx_1,x_2,\dots,x_N arrivano uno alla volta, si leggono una volta sola e non si possono riguardare. La memoria è molto minore di NN (spesso polilogaritmica) e NN può essere ignoto. Gli algoritmi sono randomizzati e approssimati: si chiede una stima entro ε\varepsilon con probabilità almeno 1−δ1-\delta.

È il caso dei contatori di un router, dei log di un server, dei dati dei sensori. Gli strumenti sono quelli già visti: valore atteso e varianza (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 →, 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 →), l'hashing universale (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 →) e l'amplificazione per ripetizione (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 →).

Campionamento di riserva

Problema. Estrarre dal flusso un campione di kk elementi, uniforme tra i (Nk)\binom Nk sottoinsiemi possibili, con memoria kk e senza conoscere NN.

Algoritmo (reservoir sampling). Si tengono i primi kk elementi. All'arrivo dell'elemento i>ki>k: si estrae jj uniforme in {1,…,i}\{1,\dots,i\}; se j≤kj\le k l'elemento ii sostituisce quello nello slot jj, altrimenti viene scartato.

Teorema. Dopo aver letto i≥ki\ge k elementi, ognuno di essi è nel campione con probabilità esattamente k/ik/i (e ogni sottoinsieme di kk elementi ha probabilità 1/(ik)1/\binom ik).

Dimostrazione (per induzione su ii). Per i=ki=k la probabilità è 1=k/k1=k/k. Passo i→i+1i\to i+1: l'elemento nuovo entra con probabilità P(j≤k)=ki+1P(j\le k)=\frac k{i+1}. Un elemento vecchio xx è nel campione con probabilità ki\frac ki (ipotesi induttiva); dato che lo è, occupa uno slot e viene espulso solo se jj coincide con quello slot, cioè con probabilità 1i+1\frac1{i+1}; quindi sopravvive con probabilità ii+1\frac i{i+1} e la probabilità totale è ki⋅ii+1=ki+1\frac ki\cdot\frac i{i+1}=\frac k{i+1}. □\square Per k=1k=1: l'elemento jj sostituisce con probabilità 1j\frac1j e poi non viene più sostituito con probabilità ∏t=j+1N(1−1t)=jN\prod_{t=j+1}^N(1-\frac1t)=\frac jN, in totale 1j⋅jN=1N\frac1j\cdot\frac jN=\frac1N.

Esempio (N=5N=5, k=2k=2, elenco esatto). Si enumerano tutte le scelte casuali del programma (con probabilità razionali): ognuno dei 55 elementi è nel campione con probabilità 25\frac25 e ognuno dei (52)=10\binom52=10 sottoinsiemi ha probabilità 110\frac1{10}. L'algoritmo "ogni nuovo elemento entra con probabilità 12\frac12 in uno slot a caso" non è uniforme: con N=5N=5, k=2k=2 dà 2764\frac{27}{64} ai primi due elementi e 12\frac12 all'ultimo, invece di 25\frac25 a tutti. Per k=1k=1 e sostituzione con probabilità 12\frac12 i cinque elementi hanno probabilità 116,116,18,14,12\frac1{16},\frac1{16},\frac18,\frac14,\frac12.

Contatore di Morris

Problema. Contare fino a nn con O(log⁡log⁡n)O(\log\log n) bit invece di log⁡2n\log_2n, accettando un'approssimazione.

Algoritmo (contatore di Morris). Si memorizza solo un piccolo intero XX, inizialmente 00. A ogni evento: con probabilità 2−X2^{-X} si pone X←X+1X\leftarrow X+1. Stima: n~=2X−1\tilde n=2^X-1.

Idea: XX approssima log⁡2n\log_2n, e per incrementarlo da XX a X+1X+1 servono in media 2X2^X eventi, ciascuno dei quali pesa quanto la stima.

Teorema. Dopo nn eventi, E[2Xn−1]=nE[2^{X_n}-1]=n (stima non distorta) e Var(2Xn−1)=n(n−1)2\text{Var}(2^{X_n}-1)=\frac{n(n-1)}2.

Dimostrazione. Sia Zn=2XnZ_n=2^{X_n}. Dato Xn=xX_n=x: Zn+1=2x+1Z_{n+1}=2^{x+1} con probabilità 2−x2^{-x} e 2x2^x altrimenti. Quindi E[Zn+1∣Xn=x]=2x+12−x+2x(1−2−x)=2x+1,E[Zn+12∣Xn=x]=4x+12−x+4x(1−2−x)=4x+3⋅2x.E[Z_{n+1}\mid X_n=x]=2^{x+1}2^{-x}+2^x(1-2^{-x})=2^x+1,\qquad E[Z_{n+1}^2\mid X_n=x]=4^{x+1}2^{-x}+4^x(1-2^{-x})=4^x+3\cdot2^x. Prendendo i valori attesi: E[Zn+1]=E[Zn]+1E[Z_{n+1}]=E[Z_n]+1 e E[Zn+12]=E[Zn2]+3E[Zn]E[Z_{n+1}^2]=E[Z_n^2]+3E[Z_n]. Con Z0=1Z_0=1 la prima dà E[Zn]=n+1E[Z_n]=n+1. Sostituendo nella seconda, E[Zn2]=1+3∑i=1ni=1+3n(n+1)2E[Z_n^2]=1+3\sum_{i=1}^ni=1+\frac{3n(n+1)}2. Infine Var(Zn)=1+3n(n+1)2−(n+1)2=n2−n2\text{Var}(Z_n)=1+\frac{3n(n+1)}2-(n+1)^2=\frac{n^2-n}2. □\square

Esempio (n=3n=3). XX vale 1,2,31,2,3 con probabilità 14,58,18\frac14,\frac58,\frac18 (da X=1X=1: sale con 12\frac12; da X=2X=2: sale con 14\frac14). Le stime 2X−1=1,3,72^X-1=1,3,7 danno E=14+158+78=3E=\frac14+\frac{15}8+\frac78=3, come deve. L'enumerazione esatta con frazioni conferma E[Zn]=n+1E[Z_n]=n+1 e Var=n(n−1)2\text{Var}=\frac{n(n-1)}2 per n=1,2,3,4,10,30n=1,2,3,4,10,30.

Precisione. La deviazione standard ≈n/2\approx n/\sqrt2 è grande quanto la stima: un solo contatore è troppo grossolano. Rimedi:

  • Media di ss contatori indipendenti: varianza n(n−1)2s\frac{n(n-1)}{2s}; per Chebyshev P(∣n~−n∣≥εn)≤12sε2P(|\tilde n-n|\ge\varepsilon n)\le\frac{1}{2s\varepsilon^2}, e basta s≥12ε2δs\ge\frac1{2\varepsilon^2\delta} per probabilità di errore δ\delta (per ε=δ=0,1\varepsilon=\delta=0{,}1: s=500s=500).
  • Base 1+a1+a: si incrementa con probabilità (1+a)−X(1+a)^{-X} e si stima (1+a)X−1a\frac{(1+a)^X-1}a; la stima resta non distorta e Var=a n(n−1)2\text{Var}=\frac{a\,n(n-1)}2 (verificato esattamente per a=12a=\frac12 e a=110a=\frac1{10}, n=20n=20: 9595 e 1919). Con a=2ε2δa=2\varepsilon^2\delta un solo contatore dà P(errore≥εn)≤δP(\text{errore}\ge\varepsilon n)\le\delta per Chebyshev. Con ε=δ=0,1\varepsilon=\delta=0{,}1 (a=0,002a=0{,}002) e n=106n=10^6, X≈3800X\approx3800: 1212 bit invece dei 2020 del conteggio esatto.

Simulazione (n=1000n=1000, a=1a=1). Su 20 00020\,000 prove la media delle stime è 998,2998{,}2 e la deviazione standard 706,7706{,}7 (teoria 1000⋅999/2=706,8\sqrt{1000\cdot999/2}=706{,}8); XX vale in media 9,699{,}69 (log⁡21001=9,97\log_2 1001=9{,}97) e al massimo 1313. La media di 500500 contatori ha deviazione standard 34,134{,}1 (teoria 31,631{,}6), e in 300300 prove nessuna volta l'errore supera il 10%10\% di nn.

Elementi distinti

Problema. Quanti valori diversi compaiono nel flusso? Con memoria Ω(d)\Omega(d) è banale (insieme dei visti); si vuole una stima con memoria piccola.

Idea comune. Una funzione hash casuale manda ogni valore distinto in un punto uniforme di (0,1)(0,1), e i duplicati nello stesso punto: la statistica che si guarda dipende solo dall'insieme dei distinti.

Flajolet-Martin (idea)

Si mandano gli elementi in stringhe di bit e si indica con ρ(x)\rho(x) il numero di zeri finali dell'hash: P(ρ≥j)=2−jP(\rho\ge j)=2^{-j}. Con dd valori distinti, circa d2−jd2^{-j} hanno ρ≥j\rho\ge j: l'indice massimo R=max⁡ρR=\max\rho è vicino a log⁡2d\log_2d e 2R2^R è una stima grossolana di dd (dopo una costante di correzione ≈0,77\approx0{,}77). Una sola copia è però molto variabile. In 6060 prove con d=1000d=1000 (log⁡2d=9,97\log_2d=9{,}97) il valore RR va da 88 a 1818 (mediano 1010): per ottenere una buona stima si usano molte copie e la mediana.

Il kk-esimo minimo

Algoritmo (kk-esimo minimo, bottom-kk). Con hh che manda i valori in (0,1)(0,1) si tengono i kk valori hash distinti più piccoli visti. Se vkv_k è il kk-esimo più piccolo la stima è d^=k−1vk.\hat d=\frac{k-1}{v_k}. Se i distinti sono meno di kk si conta direttamente.

Perché funziona. Con dd punti uniformi indipendenti, il minimo vale in media 1d+1\frac1{d+1}: P(min⁡>t)=(1−t)dP(\min>t)=(1-t)^d, quindi E[min⁡]=∫01(1−t)d dt=1d+1E[\min]=\int_0^1(1-t)^d\,dt=\frac1{d+1} (per d=50d=50 la simulazione dà 0,019590{,}01959 contro 151=0,01961\frac1{51}=0{,}01961). Più punti ci sono, più i minimi sono piccoli: d≈1/v1d\approx1/v_1. Con k=1k=1 la stima 1/v11/v_1 è però inutilizzabile: E[1/V1]=d∫01v−1(1−v)d−1dvE[1/V_1]=d\int_0^1 v^{-1}(1-v)^{d-1}dv diverge vicino a v=0v=0, quindi media e varianza sono infinite. Per d=50d=50, da P(V1>t)=(1−t)50P(V_1>t)=(1-t)^{50}, il 5%5\% e il 95%95\% delle stime valgono 1/(1−0,051/50)=17,21/(1-0{,}05^{1/50})=17{,}2 e 1/(1−0,951/50)=9751/(1-0{,}95^{1/50})=975.

Teorema. Per k≥3k\ge3, E[k−1Vk]=dE\bigl[\frac{k-1}{V_k}\bigr]=d (stima non distorta) e lo scarto relativo è circa 1k−2\frac1{\sqrt{k-2}}.

Dimostrazione della media. La densità del kk-esimo più piccolo di dd punti uniformi è d!(k−1)!(d−k)!vk−1(1−v)d−k\frac{d!}{(k-1)!(d-k)!}v^{k-1}(1-v)^{d-k} (si sceglie quali k−1k-1 punti stanno sotto, quale è VkV_k, e gli altri d−kd-k stanno sopra). Quindi E[1Vk]=d!(k−1)!(d−k)!∫01vk−2(1−v)d−kdv=d!(k−1)!(d−k)!⋅(k−2)!(d−k)!(d−1)!=dk−1,E\Bigl[\frac1{V_k}\Bigr]=\frac{d!}{(k-1)!(d-k)!}\int_0^1v^{k-2}(1-v)^{d-k}dv=\frac{d!}{(k-1)!(d-k)!}\cdot\frac{(k-2)!(d-k)!}{(d-1)!}=\frac d{k-1}, dove l'integrale è la funzione Beta. □\square La varianza si calcola allo stesso modo e dà sd(d^)≈d/k−2\text{sd}(\hat d)\approx d/\sqrt{k-2}. Per Chebyshev, con k=⌈2ε2⌉+2k=\lceil\frac{2}{\varepsilon^2}\rceil+2 la stima è entro (1±ε)d(1\pm\varepsilon)d con probabilità ≥12\ge\frac12, amplificabile con la mediana di copie indipendenti. La memoria è O(k)O(k) valori hash, indipendente da dd e da NN.

Simulazione (d=105d=10^5, flusso con ripetizioni). Con k=100k=100 su 200200 prove: media 99 85299\,852, scarto relativo 0,1040{,}104 (teoria 0,1010{,}101), 95%95\% delle stime entro il 20%20\%. Con k=400k=400: media 100 107100\,107, scarto 0,0510{,}051 (teoria 0,0500{,}050), 96%96\% entro il 10%10\%.

Count-Min sketch

Problema. Stimare la frequenza f(x)f(x) di ogni elemento xx (numero di arrivi) con memoria piccola, per esempio per trovare gli elementi più frequenti.

Definizione (Count-Min sketch). Una matrice CC di dd righe e ww colonne di contatori, inizialmente 00, e dd funzioni hash indipendenti h1,…,hd:U→[w]h_1,\dots,h_d:U\to[w] da una famiglia universale. Arrivo di xx: C[j][hj(x)]+=1C[j][h_j(x)]\mathrel{+}=1 per ogni riga jj. Stima: f^(x)=min⁡jC[j][hj(x)]\hat f(x)=\min_{j}C[j][h_j(x)].

Teorema (garanzia (ε,δ)(\varepsilon,\delta)). Sia F=∑yf(y)=NF=\sum_yf(y)=N il numero totale di arrivi. Con w=⌈e/ε⌉w=\lceil e/\varepsilon\rceil e d=⌈ln⁡(1/δ)⌉d=\lceil\ln(1/\delta)\rceil: f(x)≤f^(x)sempre,P(f^(x)≤f(x)+εN)≥1−δ.f(x)\le\hat f(x)\quad\text{sempre},\qquad P\bigl(\hat f(x)\le f(x)+\varepsilon N\bigr)\ge1-\delta.

Dimostrazione. Nella riga jj la cella di xx contiene f(x)f(x) più l'errore Yj=∑y≠xf(y) 1[hj(y)=hj(x)]≥0Y_j=\sum_{y\ne x}f(y)\,\mathbf 1[h_j(y)=h_j(x)]\ge0, quindi f^(x)=f(x)+min⁡jYj≥f(x)\hat f(x)=f(x)+\min_jY_j\ge f(x). Per l'universalità P(hj(y)=hj(x))≤1wP(h_j(y)=h_j(x))\le\frac1w e, per la linearità, E[Yj]≤Nw≤εNeE[Y_j]\le\frac Nw\le\frac{\varepsilon N}e. Markov (in modo valido perché Yj≥0Y_j\ge0): P(Yj≥εN)≤1eP(Y_j\ge\varepsilon N)\le\frac1e. Le righe sono indipendenti, e f^(x)>f(x)+εN\hat f(x)>f(x)+\varepsilon N richiede che tutte le righe superino εN\varepsilon N: probabilità ≤e−d≤δ\le e^{-d}\le\delta. □\square

Esempio piccolo (p=17p=17, w=5w=5, d=3d=3). Funzioni hj(x)=((ajx+bj) mod 17) mod 5h_j(x)=((a_jx+b_j)\bmod17)\bmod5 con (aj,bj)=(3,4),(5,1),(7,9)(a_j,b_j)=(3,4),(5,1),(7,9); flusso di N=20N=20 arrivi con frequenze f(3)=7f(3)=7, f(8)=5f(8)=5, f(12)=3f(12)=3, f(15)=2f(15)=2, f(9)=2f(9)=2, f(4)=1f(4)=1. Posizioni (riga 00/11/22): 3↦3/1/33\mapsto3/1/3, 8↦1/2/48\mapsto1/2/4, 12↦1/0/312\mapsto1/0/3, 15↦0/3/215\mapsto0/3/2, 9↦4/2/49\mapsto4/2/4, 4↦1/4/34\mapsto1/4/3. Contatori finali:

riga colonna 00 11 22 33 44
00 22 99 00 77 22
11 33 77 77 22 11
22 00 00 22 1111 77

La colonna 11 della riga 00 vale 5+3+1=95+3+1=9 (collidono 8,12,48,12,4), la colonna 22 della riga 11 vale 5+2=75+2=7 (88 e 99), la colonna 33 della riga 22 vale 7+3+1=117+3+1=11. Stime: f^(8)=min⁡(9,7,7)=7\hat f(8)=\min(9,7,7)=7 (vero 55: sovrastima di 22, perché 88 collide con 99 nelle righe 11 e 22 e con 1212 e 44 nella riga 00), tutte le altre sono esatte; l'elemento mai visto 66 va nelle colonne 0,4,00,4,0 (3⋅6+4=22≡53\cdot6+4=22\equiv5, 5⋅6+1=31≡145\cdot6+1=31\equiv14, 7⋅6+9=51≡07\cdot6+9=51\equiv0 modulo 1717, poi modulo 55), con contatori 2,1,02,1,0, e ha stima min⁡(2,1,0)=0\min(2,1,0)=0. Nessuna stima è sotto la frequenza vera.

Dimensionamento. Per ε=0,001\varepsilon=0{,}001 e δ=0,01\delta=0{,}01: w=⌈e/0,001⌉=2719w=\lceil e/0{,}001\rceil=2719 colonne e d=⌈ln⁡100⌉=5d=\lceil\ln100\rceil=5 righe, cioè 13 59513\,595 contatori indipendentemente dal numero di elementi distinti. L'errore additivo è ≤εN\le\varepsilon N: va bene per gli elementi frequenti (f(x)≫εNf(x)\gg\varepsilon N), non per quelli rari.

Simulazione. Su un flusso di N=200 000N=200\,000 arrivi su 20 00020\,000 valori con distribuzione di tipo Zipf, con ε=0,01\varepsilon=0{,}01, δ=0,05\delta=0{,}05 (w=272w=272, d=3d=3) l'errore massimo osservato su tutti i valori è 1357<εN=20001357<\varepsilon N=2000; con ε=0,001\varepsilon=0{,}001, δ=0,01\delta=0{,}01 (w=2719w=2719, d=5d=5) è 44<20044<200.

python
import random, heapq, hashlib
from math import e, log, ceil

def riserva(flusso, k):
    """Campione uniforme di k elementi da un flusso di lunghezza ignota."""
    r = []
    for i, x in enumerate(flusso, 1):
        if i <= k:
            r.append(x)
        elif (j := random.randrange(1, i + 1)) <= k:   # entra con probabilità k/i
            r[j - 1] = x                               # al posto di uno slot a caso
    return r

def morris(n):
    X = 0
    for _ in range(n):
        if random.random() < 2.0 ** -X:                # incrementa con probabilità 2^-X
            X += 1
    return 2 ** X - 1                                  # stima non distorta di n

def h01(x):                                            # hash in (0,1)
    d = hashlib.blake2b(str(x).encode(), digest_size=8).digest()
    return (int.from_bytes(d, "big") + 0.5) / 2 ** 64

def distinti(flusso, k):
    """k-esimo minimo: stima (k-1)/v_k del numero di elementi distinti."""
    heap, visti = [], set()                            # max-heap (valori negati) dei k minimi
    for x in flusso:
        v = h01(x)
        if v in visti:
            continue
        if len(heap) < k:
            heapq.heappush(heap, -v); visti.add(v)
        elif v < -heap[0]:
            visti.discard(-heapq.heappushpop(heap, -v)); visti.add(v)
    return len(heap) if len(heap) < k else (k - 1) / -heap[0]

class CountMin:
    P = (1 << 61) - 1
    def __init__(self, eps, delta):
        self.w, self.d = ceil(e / eps), ceil(log(1 / delta))
        self.ab = [(random.randrange(1, self.P), random.randrange(self.P)) for _ in range(self.d)]
        self.C = [[0] * self.w for _ in range(self.d)]
    def _col(self, j, x):
        a, b = self.ab[j]
        return ((a * x + b) % self.P) % self.w
    def aggiungi(self, x, c=1):
        for j in range(self.d):
            self.C[j][self._col(j, x)] += c
    def stima(self, x):                                # mai sotto la frequenza vera
        return min(self.C[j][self._col(j, x)] for j in range(self.d))

Con 200 000200\,000 arrivi su 50 00050\,000 valori casuali (49 08049\,080 distinti) il programma completo stima 48 40148\,401 elementi distinti con k=400k=400, e un valore comparso 44 volte ha stima 7373 in un Count-Min con ε=0,001\varepsilon=0{,}001 (errore 69<εN=20069<\varepsilon N=200: per gli elementi rari la garanzia additiva è debole).

Domande d'esame

  1. Dimostra che il reservoir sampling con k=1k=1 restituisce un elemento uniforme. L'elemento jj entra con probabilità 1j\frac1j e sopravvive ai passi j+1,…,Nj+1,\dots,N con probabilità ∏t=j+1Nt−1t=jN\prod_{t=j+1}^N\frac{t-1}t=\frac jN; prodotto 1N\frac1N.
  2. Dimostra che il contatore di Morris è non distorto. E[2Xn+1∣Xn]=2Xn+1E[2^{X_{n+1}}\mid X_n]=2^{X_n}+1, quindi E[2Xn]=1+nE[2^{X_n}]=1+n e E[2Xn−1]=nE[2^{X_n}-1]=n.
  3. Con quanti contatori di Morris si ottiene errore relativo ≤10%\le10\% con probabilità ≥90%\ge90\%? Chebyshev: n(n−1)/(2s)(0,1n)2<10,02s≤0,1\frac{n(n-1)/(2s)}{(0{,}1n)^2}<\frac1{0{,}02s}\le0{,}1, quindi s≥500s\ge500.
  4. Perché nello sketch Count-Min si prende il minimo e non la media delle righe? Ogni cella contiene la frequenza vera più un errore ≥0\ge0 da collisioni: il minimo è la cella meno contaminata e non è mai sotto f(x)f(x); la media includerebbe anche le righe peggiori.

Versione ripasso

Esercizi su questo argomento