Post on 21-Jan-2017
Estruturas de dados probabilísticas
Precisam de pouca memória
Tempo de acesso é constanteCompletamente cool
- membership test- Código promocional já foi utilizado?- Usuário já realizou uma ação?
- Cardinality estimation- Quantas pessoas diferentes já assistiram a um vídeo?
- Frequency estimation- Quais são as tags mais utilizadas em comentários?
Para que serve?
Quantas pessoas diferentes que leram a notícia principal publicaram comentários com a tag mais frequente?
Get crazy!
Cardinality estimationMembership testFrequency estimation
Função determinística, sobrejetora, com domínio de tamanho arbitrário e contradomínio finito
Função hash
Função determinística, sobrejetora, com domínio de tamanho arbitrário e contradomínio finito
Função hash
Waat?
Linear Probabilistic CounterEstrutura de dados que permite realizar:
- membership test- cardinality estimation
Linear Probabilistic CounterBitset de tamanho m, com todas as posições inicialmente zeradas
0 0 0 0 0 0 0 0 0 0 0 00 1 2 3 4 5 6 7 8 9 10 11
m = 12
Linear Probabilistic Counter
0 0 0 1 0 0 0 0 0 0 0 00 1 2 3 4 5 6 7 8 9 10 11
m = 12
Adicionamos “joão”
hash(João) => 3
hash(João) => 3
Linear Probabilistic Counter
0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11
m = 12
Adicionamos “Teresa”hash(Teresa) => 10
hash(João) => 3
Linear Probabilistic Counter
0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11
m = 12
Adicionamos “Renato”hash(Teresa) => 10hash(Renato) => 3
Linear Probabilistic Counter
0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11
m = 12
Membership test: “Luana já foi inserida?”
hash(Luana) => 7
Linear Probabilistic Counter
0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11
m = 12
Membership test: “Luana já foi inserida?”
hash(Luana) => 7Nops
Linear Probabilistic Counter
0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11
m = 12
Membership test: “Eli já foi inserido?”
hash(Eli) => 10
Linear Probabilistic Counter
0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11
m = 12
Membership test: “Eli já foi inserido?”
hash(Eli) => 10Talvez
Linear Probabilistic Counter
0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11
m = 12
Membership test: “Eli já foi inserido?”
hash(Eli) => 10Talvez
Falsos Positivos são possíveisTaxa de erro é definida pela taxa de colisão
Linear Probabilistic Counter
0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11
m = 12
Cardinality estimation: “Quantos nomes diferentes foram inseridos?”
Linear Probabilistic Counter
0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11
m (tamanho do bitset) = 12
Cardinality estimation: “Quantos nomes diferentes foram inseridos?”
card(m, w) = -m ln m - wm
w (nº de bits 1) = 2
Bloom filterEstrutura de dados muito parecida com o linear probabilistic counter que permite realizar Membership test
0 0 0 0 0 0 0 0 0 0 0 00 1 2 3 4 5 6 7 8 9 10 11
m = 12; k = 3
Bloom filterCada inserção marca k bits, ao invés de um único
0 0 0 0 0 0 0 0 0 0 0 00 1 2 3 4 5 6 7 8 9 10 11
m = 12; k = 3
Bloom filterCada inserção marca k bits, ao invés de um único
0 0 0 1 0 1 1 0 0 0 0 00 1 2 3 4 5 6 7 8 9 10 11
m = 12; k = 3
hash(João) => [3, 5, 6]
Bloom filterCada inserção marca k bits, ao invés de um único
0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11
m = 12; k = 3
hash(Renato) => [5, 10, 11]
Bloom filterMEmbership test: “Luiz já foi inserido?”
0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11
m = 12; k = 3
hash(Luiz) => [3, 4, 6]
Bloom filterMEmbership test: “Luiz já foi inserido?”
0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11
m = 12; k = 3
hash(Luiz) => [3, 4, 6]Nah
Bloom filterMEmbership test: “Luana já foi inserida?”
0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11
m = 12; k = 3
hash(Luana) => [6, 10, 11]
Bloom filterMEmbership test: “Luana já foi inserida?”
0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11
m = 12; k = 3
hash(Luana) => [6, 10, 11]
Provavelmente
Bloom filterMEmbership test: “Luana já foi inserida?”
0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11
m = 12; k = 3
hash(Luana) => [6, 10, 11]
Provavelmente
Também pode apresentar falso positivos, mas geralmente são mais raros
Count-min sketchPara cada elemento observado, incrementamos n posições
0 0 1 0
0 0 0 11 0 0 0
0 1 0 0
hash(João) => [2, 0, 1, 3]
Count-min sketchPara cada elemento observado, incrementamos n posições
1 0 2 0
0 0 0 11 1 0 1
0 1 0 0
hash(Eli) => [1, 2, 1, 2]
Count-min sketch… obtemos uma estimativa da frequência de um elemento, observando a menor contagem para aquele elemento
hash(João) => [2, 0, 1, 3]11 0 2 5
7 6 4 54 6 15 13
9 19 10 8
Count-min sketchA estimativa sempre será maior ou igual à frequência real
11 0 2 5
7 6 4 54 6 15 13
9 19 10 8
hash(João) => [2, 0, 1, 3]
Count-min sketchA estimativa sempre será maior ou igual à frequência real
11 0 2 5
7 6 4 54 6 15 13
9 19 10 8
hash(João) => [2, 0, 1, 3]
Tende a ser melhor quando alguns elementos são muito mais frequentes que outros
LogLog CounterFornece cardinality estimation utilizando muuuuito pouca memória e com boa precisão para conjuntos com muitos elementos
LogLog CounterBAseia-se na ideia de que, sabendo qual foi o elemento mais raro encontrado, é possível obter uma estimativa de quantos elementos foram vistos
LogLog CounterRank(X) - “raridade do elemento”Rank de binários
1111111111111110...
01111111...
00111111...
00000001
1
2
3
8
Raridade definida pelo número zeros iniciaisn/(2^K) elementos começando com k - 1 zeros
LogLog CounterEstimativa instável:
card(k) = 2^k
k = maior rank encontrado
Podemos obter uma estimativa precisa realizando uma média entre várias estimativas instáveis
LogLog CounterBucketsCada bucket armazena o maior rank observado dentro de um conjunto de valores
0
00
0
0
01234
LogLog CounterEstimativa precisa:
card(m, buckets) = αm.m.2^(∑buckets[j] / m)
m = número de buckets
αm =
j
Γ(−1/m) 1−2 -m
log 2
1/m
( ) ~~ 0.39701
LogLog CounterEstimativa precisa:
card(m, buckets) = αm.m.2^(∑buckets[j] / m)
m = número de buckets
αm =
j
Γ(−1/m) 1−2 -m
log 2
1/m
( ) ~~ 0.39701
Crazy math totally worth it
Outras estruturas de dadosStream summary
dezenas de variações de bloom filter
Count-mean-min sketch
HyperLogLog Counter
Referências- Loglog Counting of Large Cardinalities - Marianne Durand , Philippe Flajolet 2003- Space/time trade-offs in hash coding with allowable errors - Burton H. Bloom 1970- A Linear-Time Probabilistic Counting Algorithm for Database Applications - KYU-
YOUNG WHANG , HOWARD M. TAYLOR 1990- Count-Min Sketch - Graham Cormode 2003- PROBABILISTIC DATA STRUCTURES FOR WEB ANALYTICS AND DATA MINING (https:
//highlyscalable.wordpress.com/2012/05/01/probabilistic-structures-web-analytics-data-mining/) - Ilya Katsov