SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
ferret go GmbH, Berlin
Dr.Andrii Gakhov
ВЕРОЯТНОСТНЫЕ СТРУКТУРЫ ДАННЫХ
И ИХ ПРИМЕНЕНИЕ
MEMBERSHIP
Содержание:
▸ Bloom Filter
• Определить принадлежность элемента к
множеству с большим числом элементов
THE PROBLEM
BLOOM FILTER
BLOOM FILTER
• предложил Burton Howard Bloom, 1970
• Bloom filter это реализация вероятностного множества с 3
операциями:
• добавить элемент в множество
• проверить, что элемент принадлежит множеству
• проверить, что элемент не принадлежит множеству
• Bloom filter описывается 2 параметрами:
• m - длина фильтра 

(пропорциональна ожидаемому числу элементов n)
• k - число различных хэш-функций

(k намного меньше, чем m)
• Bloom filter не хранит сами элементы и требует только 1 byte на
единицу сохраненных данных
BLOOM FILTER: ALGORITHM
• Bloom filter представляет собой bit array длиной m bits, все
элементы которого равны 0 в самом начале
• Добавление элемента - вычислить значения всех k хэш-
функций для данного элемента и установить биты с
соответствующими индексами
• Проверка принадлежности элемента - вычислить значения
всех k хэш-функций для данного элемента и проверить биты
с соответствующими индексами:
• если все биты установлены, тогда ответ “может быть”
• если хотя бы 1 бит установлен, тогда ответ “точно нет”
• Время, необходимое для добавления элемента или его
проверки, является постоянным O(k) и не зависит от
количества элементов множества
BLOOM FILTER: EXAMPLE
• Рассмотрим Bloom filter длиной 16 bits (m=16)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
• Рассмотрим 2 хэш-функции (k=2): 

MurmurHash3 и Fowler-Noll-Vo

(соответствующие индексы вычисляются как mod 16)
• Добавим элемент в фильтр: “ferret”:

MurmurHash3(“ferret”) = 1, FNV(“ferret”) = 11
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
BLOOM FILTER: EXAMPLE
• Добавим элемент в фильтр: “bernau”:

MurmurHash3(“bernau”) = 4, FNV(“bernau”) = 4
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0
• Проверим принадлежности элемента: “berlin”:

MurmurHash3(“berlin”) = 4, FNV(“berlin”) = 12

Bit 12 не установлен, следовательно “berlin” точно не
принадлежит множеству
• Проверим принадлежности элемента: “paris”:

MurmurHash3(“paris”) = 11, FNV(“paris”) = 4

Bits 4 и 11, следовательно элемент наверное принадлежит
множеству (false positive)
BLOOM FILTER: PROPERTIES
• Возможны ложно-позитивные срабатывания

(false positive - элемент не в множестве, но все биты установлены)
• Ложно-негативные срабатывания не возможны
• Хэш-функции должны быть независимые и
равномерно распределенные.
• Хэш-функции должны быть быстрыми в вычислении

(не стоит использовать криптографические хэш-функции, как sha1)
• При помощи выбора k и m можно уменьшить
вероятность ложно-позитивного срабатывания.
P e ∈ℑ| e ∉ℑ( ) ≈ 1− e
kn
m
⎛
⎝⎜
⎞
⎠⎟
k
P e ∉ℑ| e ∈ℑ( )= 0
k∗
=
m
n
ln2
BLOOM FILTER: APPLICATIONS
• Google BigTable, Apache HBase и Apache Cassandra
используют Bloom filters для уменьшения операций
проверки диска для несуществующих строк и столбцов
• Medium использует Bloom filters, чтобы рекомендовать
статьи, которые читатель ранее не читал
• Google Chrome web browser использовал Bloom filter
для проверки URL по базе известных вредоносных
сайтов (заменено на PrefixSet, Issue 71832)
• Squid Web Proxy Cache исползует Bloom filters для
управления кешированием
BLOOM FILTER: PROBLEMS
• Классический Bloom filter не поддерживает операцию
удаления.
• Bloom filters работаю хорошо, пока они помещаются в
память
• ~1 byte на элемент (3x-4x больше для Counting Bloom filters,
поддерживающих удаление)
• Что происходит когда Bloom filters не помещаются в память?
• На обычных магнитных дисках Bloom filters умирают. Обычный диск
поддерживает только 100–200 (random) I/Os в секунду, а каждая операция
с Bloom filter требует множество I/Os.
• На SSD дисках Bloom filters менее производительны - в 10000 раз
медленнее, чем в памяти.
• Буферизация может помочь, но возникают проблемы из-за
масштабирования, уменьшающие эффект буфферизации.
BLOOM FILTER: VARIANTS
• Attenuated Bloom filters используют массивы фильтров для
вычисления кратчайших путей
• Spectral Bloom filters используются для оценки частот элементов.
• Counting Bloom Filters являются раширением классического
варианта, поддерживающим операцию удаления. Вместо одного
бита, они используют счетчик элементов, который увеличивается
при кадой операции добавления и уменьшается при удалении.
• Compressed Bloom filters предназначены для оптимизации
размера фильтра при сохранении приемлемой вероятности ошибки.
• Bloom Filter Cascade реализуют фильтрацию через каскад из Bloom
filters.
• Scalable Bloom Filters могут динамически адаптироваться к
количеству сохраненных элементов, поддерживая требуемую
оценку вероятности ошибки.
BLOOM FILTER: PYTHON
• https://github.com/jaybaird/python-bloomfilter

pybloom is a module that includes a Bloom Filter data
structure along with an implementation of Scalable
Bloom Filters
• https://github.com/seomoz/pyreBloom

pyreBloom provides Redis backed Bloom Filter using
GETBIT and SETBIT
BLOOM FILTER: READ MORE
• http://dmod.eu/deca/ft_gateway.cfm.pdf
• https://en.wikipedia.org/wiki/Bloom_filter
• https://www.cs.uchicago.edu/~matei/PAPERS/bf.doc
• http://gsd.di.uminho.pt/members/cbm/ps/dbloom.pdf
• https://www.eecs.harvard.edu/~michaelm/postscripts/
im2005b.pdf
FREQUENCY
Содержание:
▸ Count-Min Sketch
• Определить частоту элемента в множестве
THE PROBLEM
COUNT-MIN SKETCH
COUNT-MIN SKETCH
• предложен G. Cormode, S. Muthukrishnan в 2003
• CM Sketch это сублинейная пространственная структура
данных, поддерживающая 2 операции:
• добавление элемента
• подсчет сколько раз элемент был добавлен (частота)
• Count-Min Sketch описывается 2 параметрами:
• m - число “ячеек” 

(независимо от n, но намного меньше)
• k - число различных хэш-функций со значениям 1…m

(k намного меньше m)
• CM Sketch занимает ограниченно пространство: m*k
счетчиков и k хэш-функций
COUNT-MIN SKETCH: ALGORITHM
• Count-Min Sketch это просто матрица из счетчиков (все равны 0),
где каждая строка соответсвует определенней хэш-функции hi, i=1…k
• Добавление элемента - вычислить значения всех k хэш-функций и
увеличить счетчики на позициях [i, hi(element)], i=1…k
• Вычисление частоты элемента - вычислить значения всех k хэш-
функций и вернуть минимальное из значений счетчиков на позициях
[i, hi(element)], i=1…k.
• ВАЖНО: Из-за возможных коллизий (soft collisions) мы имеем k (разных) оценок
настоящей частоты элемента, но т.к. мы никогда не уменьшаем счетчик, эти
оценки могут быть только больше или равны частоте.
• Время добавления или вычисления частоты элемента фиксировано
O(k) при условии, что все хэш-функции могут быть вычислены на
постоянное время.
COUNT-MIN SKETCH: EXAMPLE
• Рассмотрим CM Sketch с 16 столбцами (m=16)
• Рассмотрим 2 хэш-функции(k=2):

h1 - MurmurHash3 и h2 - Fowler-Noll-Vo

(соответствующие индексы вычисляются как mod 16)
• Добавим элемент: “berlin”

h1(“berlin”) = 4, h2(“berlin”) = 12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01
2
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 01
2
0
COUNT-MIN SKETCH: EXAMPLE
• Добавим элемент “berlin”еще 5 раз:
• Добавим элемент “bernau”: h1(“bernau”) = 4, h2(“bernau”) = 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0
0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 01
2
0
• Добавим элемент “paris”: h1(“paris”) = 11, h2(“paris”) = 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 1 0 0 0 0 0 0 0 6 0 0 0
0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 01
2
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 2 0 0 0 0 0 0 0 6 0 0 0
0 0 0 0 7 0 0 0 0 0 0 1 0 0 0 01
2
0
COUNT-MIN SKETCH: EXAMPLE
• Вычислим частоту: “london”:

h1(“london”) = 7, h2(“london”) = 4

freq(“london”) = min (0, 2) = 0
• Вычислим частоту: “berlin”:

h1(“berlin”) = 4, h2(“berlin”) = 12

freq(“berlin”) = min (7, 6) = 6
• Вычислим частоту: “warsaw”:

h1(“warsaw”) = 4, h2(“warsaw”) = 12

freq(“warsaw”) = min (7, 6) = 6 !!! due to hash collision
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 2 0 0 0 0 0 0 0 6 0 0 0
0 0 0 0 7 0 0 0 0 0 0 1 0 0 0 01
2
0
COUNT-MIN SKETCH: PROPERTIES
• Count-Min Sketch возвращает только оценку сверху
• Для достижения вероятности ошибки δ, необходимо
выбрать k ≥ ln 1/δ.
• для δ около 1%, k = 5 - достаточно
• Count-Min Sketch фактически является такой же
структурой как и Counting Bloom filter. 

Разница задается только их назначением:
• Count-Min Sketch имеет сублинейное число ячеек, в соответствии с
выбранной точностью, но независимо от ожидаемого числа
элементов в множестве
• Counting Bloom filter имеет размер в зависимости от ожидаемого
числа элементов в множестве.
COUNT-MIN SKETCH: APPLICATIONS
• AT&T использует Count-Min Sketch в сетевых
коммутаторах для анализа трафика в условиях
ограниченной памяти
• Google использует “count sketch” (предшественник
count-min sketch) в своей инфраструктуре
параллельного вычисления MapReduce
• Реализован как часть библиотеки Algebird от
Twitter
COUNT-MIN SKETCH: PYTHON
• https://github.com/rafacarrascosa/countminsketch

CountMinSketch is a minimalistic Count-min Sketch in
pure Python
• https://github.com/farsightsec/fsisketch

FSI Sketch a disk-backed implementation of the Count-
Min Sketch algorithm
COUNT-MIN SKETCH: READ MORE
• http://dimacs.rutgers.edu/~graham/pubs/papers/cm-
latin.pdf
• http://dimacs.rutgers.edu/~graham/pubs/papers/
cmencyc.pdf
• http://dimacs.rutgers.edu/~graham/pubs/papers/
cmsoft.pdf
• http://theory.stanford.edu/~tim/s15/l/l2.pdf
• http://www.cs.dartmouth.edu/~ac/Teach/CS49-Fall11/
Notes/lecnotes.pdf
CARDINALITY
Содержание:
▸ Linear Counting
• Найти число различных элементов (мощность)
в множестве с большим числом элементов
THE PROBLEM
LINEAR COUNTING
LINEAR COUNTING: ALGORITHM
• Линейный счетчик это битовый массив (хэш-
таблица) размера m (все равны 0).
• Алгоритм состоит из нескольких шагов:
• для каждого элемента множества вычислить
значение хэш-функции и установить
соответствующий бит
• вычислить долю V пустых битов в структуре

(отношение числа пустых битов к размеру счетчика m )
• вычислить оценку мощности множества как

n ≈ -m ln V
LINEAR COUNTING: EXAMPLE
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
• Рассмотрим 16-битный линейный счетчик (m=16)
• Рассмотрим MurmurHash3 в качестве хэш-функции h

(соответствующие индексы вычисляются как mod 16)
• Добавим 10 элементов в множество: “bernau”, “bernau”,
“bernau”, “berlin”, “kiev”, “kiev”, “new york”, “germany”, “ukraine”,
“europe” (мощность данного множества n = 7)
h(“bernau”) = 4, h(“berlin”) = 4, h(“kiev”) = 6, h(“new york”) = 6,
h(“germany”) = 14, h(“ukraine”) = 7, h(“europe”) = 9
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0
LINEAR COUNTING: EXAMPLE
число пустых битов: 11
m = 16
V = 11 / 16 = 0.6875
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0
• Оценка мощности множества
n ≈ - 16 * ln (0.6875) = 5.995
LINEAR COUNTING: READ MORE
• http://dblab.kaist.ac.kr/Prof/pdf/Whang1990(linear).pdf
• http://www.codeproject.com/Articles/569718/
CardinalityplusEstimationplusinplusLinearplusTimep
SIMILARITY
Agenda:
▸ MinHash
• Найти похожие множества (документы) в
коллекции
THE PROBLEM
MINHASH
SIMILARITY
• Как правило, в задачах информационного поиска (Information
Retrival, IR) возникает необходимость оценки подобия
документов
• Документ может быть представлен набором своих слов (“bag
of words”) и рассматриваться как множество элементов
некоего универсального множества слов, составляющих все
документы коллекции
• Jaccard similarity для двух множеств A и B:
JS =
A ∩ B
A ∪ B
MINHASH: MATRIX REPRESENTATION
• Коллекция множеств может быть представлена для наглядности
как характеристическая матрица C.
• Столбцы матрицы соответствуют множествам, а строки -
элементам универсального множества всех элементов, из
которых состоят множества
• C(r, c) =1 если элемент в строке r принадлежит множеству в
столбце c, иначе C(r,c) =0
• ВАЖНО: Характеристическая матрица не используется для
непосредственного хранения данных - только для из
представления.
• Одной из причин этого - разреженность матрицы в большинстве случаев.
MINHASH: MATRIX REPRESENTATION
• Рассмотрим коллекцию множеств (документов, представленные
токенами):
• S1 = {python, is, a, programming, language}
• S2 = {java, is, a, programming, language}
• S3 = {a, programming, language}
• S4 = {python, is, a, snake}
• Характеристическая матрица имеет вид:
row S1 S2 S3 S4
a 0 1 1 1 1
is 1 1 1 0 1
java 2 0 1 0 0
language 3 1 1 1 0
programming 4 1 1 1 0
python 5 1 0 0 1
snake 6 0 0 0 1
MINHASH: INTUITION
• Значение minhash для каждого столбца характеристической
матрицы - значение индекса первой строки в перестановке, при
которой в столбце стоит 1
• Для вычисления minhash для всей коллекции (представленной
такими столбцами), необходимо выбрать перестановки строк.
• Для большой характеристической матрицы это не достижимо за
ограниченное время, т.к. приходится выбирать миллионы и
миллиарды строк (это даже без учета сортировки).
• Можно смоделировать эффект случайных перестановок, путем
выбора случайных хэш-функций, которые отображают индексы
строк в количество ячеек, равному количеству столбцов.
• Вместо выбора n случайных перестановок столбцов, достаточно
вычислить n случайно выбранных хэш-функций h1, h2, . . . , hn для
индексов строк
MINHASH: ALGORITHM
• Выбрать n хэш-функций h1, h2, . . . , hn
• Для каждого множества из коллекции S (для каждого столбца),
вычислить значение хэш-функций - вектор [h1(S), h1(S), . . . , h1(S)].
• Построить характеристическую матрицу C коллекции.
• Построить матрицу сигнатур SIG, где SIG(i, c) соответсвует i
й
хэш-
функции и столбцу c. Сначала все SIG(i, c) = ∞ для каждого i и c.
• Для каждой строки r:
• Вычислить h1(r), h2(r), . . . , hn(r)
• Для каждого столбца c:
• Если C(r,c) = 1, тогда SIG(i, c) = min{SIG(i,c), hi(r)} для i = 1..n
• Оценить подобие между множествами используя финальную
версию матрицы сигнатур
MINHASH: PROPERTIES
• Связь между minhash и Jaccard similarity:
• Вероятность того, что функция minhash для случайной
перестановки строк вернет одинаковое значение для двух
множеств равна значению Jaccard similarity этих множеств
MINHASH: EXAMPLE
• Рассмотрим 2 хэш-функции:
• h1(x) = x + 1 mod 7
• h2(x) = 3x + 1 mod 7
row S1 S2 S3 S4 h1(row) h2 (row)
a 0 1 1 1 1 1 1
is 1 1 1 0 1 2 4
java 2 0 1 0 0 3 0
language 3 1 1 1 0 4 3
programming 4 1 1 1 0 5 6
python 5 1 0 0 1 6 2
snake 6 0 0 0 1 0 5
• Рассмотрим ту же самую коллекцию из 4 документов и 7 слов
MINHASH: EXAMPLE
S1 S2 S3 S4
h1 ∞ ∞ ∞ ∞
h2 ∞ ∞ ∞ ∞
• Сначала все значения равны ∞:
• На первом шаге рассмотрим строку 0, ее сигнатуры равны h1(0)=h2(0)=1. Все документы
имеют 1 в данной строке - следовательно, мы вносим значения h1 и h2 в матрицу сигнатур:
r S1 S2 S3 S4 h1 h2
0 1 1 1 1 1 1
1 1 1 0 1 2 4
2 0 1 0 0 3 0
3 1 1 1 0 4 3
4 1 1 1 0 5 6
5 1 0 0 1 6 2
6 0 0 0 1 0 5
S1 S2 S3 S4
h1 1 1 1 1
h2 1 1 1 1
• Далее, рассмотрим строку 1, ее сигнатуры равны h1(1) = 2 и h2(1) = 4. В данной строке
только S1, S2 и S4 имеют 1, поэтому только для этих столбцов мы обновляет сигнатуры -
равные минимуму между существующем значением и значениями h1(1) = 2 и h2(1) = 4
соответственно:
S1 S2 S3 S4
h1 2 2 1 2
h2 4 4 1 4
MINHASH: EXAMPLE
S1 S2 S3 S4
h1 2 2 1 2
h2 2 0 1 2
• Продолжаем с остальными строками и после строки с индексом 5
матрица имеет вид
• Наконец, рассмотрим строку 6, ее сигнатуры равны h1(6) = 0 и h2(6) = 5. В этой строке только
S4 имеет 1, следовательно, обновляем только значения в этом столбце, устанавливая их
минимуму существующего значения и 0 для h1 или 5 для h2. Итоговая матрица сигнатур
имеет вид:
S1 S2 S3 S4
h1 2 2 1 0
h2 2 0 1 2
r S1 S2 S3 S4 h1 h2
0 1 1 1 1 1 1
1 1 1 0 1 2 4
2 0 1 0 0 3 0
3 1 1 1 0 4 3
4 1 1 1 0 5 6
5 1 0 0 1 6 2
6 0 0 0 1 0 5
• Нет полностью идентичных документов в коллекции.
• Документы S1 и S2 согласуются по половине сигнатур, т.е. их коэффициент подобия
равен 0.5 (точное значение JS = 0.66)
• Документы S1 и S4 тоже согласуются по половине сигнатур, т.е. их коэффициент
подобия равен 0.5 (точное значение JS = 0.33)
• Документы S3 и S4 не согласуются по сигнатурам, т.е. их коэффициент подобия
равен 0 (точное значение JS = 0.16666…)
MINHASH: PYTHON
• https://github.com/ekzhu/datasketch

datasketch gives you probabilistic data structures that
can process vary large amount of data
• https://github.com/anthonygarvan/MinHash

MinHash is an effective pure python implementation of
Minhash
MINHASH: READ MORE
• http://infolab.stanford.edu/~ullman/mmds/book.pdf
• http://www.cs.cmu.edu/~guyb/realworld/slidesS13/
minhash.pdf
• https://en.wikipedia.org/wiki/MinHash
• http://www2007.org/papers/paper570.pdf
• https://www.cs.utah.edu/~jeffp/teaching/cs5955/L4-
Jaccard+Shingle.pdf
▸ @gakhov
▸ linkedin.com/in/gakhov
▸ www.datacrucis.com
THANK YOU

Contenu connexe

Tendances

Git Lab Introduction
Git Lab IntroductionGit Lab Introduction
Git Lab IntroductionKrunal Doshi
 
Speed Up Your JavaScript
Speed Up Your JavaScriptSpeed Up Your JavaScript
Speed Up Your JavaScriptNicholas Zakas
 
Gitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a proGitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a prosparkfabrik
 
Branch and bounding : Data structures
Branch and bounding : Data structuresBranch and bounding : Data structures
Branch and bounding : Data structuresKàŕtheek Jåvvàjí
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Adriano Teixeira de Souza
 
DSA (Data Structure and Algorithm) Questions
DSA (Data Structure and Algorithm) QuestionsDSA (Data Structure and Algorithm) Questions
DSA (Data Structure and Algorithm) QuestionsRESHAN FARAZ
 
Version Control System - Git
Version Control System - GitVersion Control System - Git
Version Control System - GitCarlo Bernaschina
 
Introduction to Git and GitHub
Introduction to Git and GitHubIntroduction to Git and GitHub
Introduction to Git and GitHubVikram SV
 
Selection sort
Selection sortSelection sort
Selection sortstella D
 
mykola marzhan - jenkins on aws spot instance
mykola marzhan - jenkins on aws spot instancemykola marzhan - jenkins on aws spot instance
mykola marzhan - jenkins on aws spot instanceDariia Seimova
 

Tendances (20)

Intro to Git, GitHub, and BitBucket
Intro to Git, GitHub, and BitBucketIntro to Git, GitHub, and BitBucket
Intro to Git, GitHub, and BitBucket
 
Git Lab Introduction
Git Lab IntroductionGit Lab Introduction
Git Lab Introduction
 
Speed Up Your JavaScript
Speed Up Your JavaScriptSpeed Up Your JavaScript
Speed Up Your JavaScript
 
Gitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a proGitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a pro
 
Branch and bounding : Data structures
Branch and bounding : Data structuresBranch and bounding : Data structures
Branch and bounding : Data structures
 
Introduction to Git and Github
Introduction to Git and GithubIntroduction to Git and Github
Introduction to Git and Github
 
Gitlab flow
Gitlab flowGitlab flow
Gitlab flow
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
 
DSA (Data Structure and Algorithm) Questions
DSA (Data Structure and Algorithm) QuestionsDSA (Data Structure and Algorithm) Questions
DSA (Data Structure and Algorithm) Questions
 
Version Control System - Git
Version Control System - GitVersion Control System - Git
Version Control System - Git
 
Introduction to Git and GitHub
Introduction to Git and GitHubIntroduction to Git and GitHub
Introduction to Git and GitHub
 
Red Black Tree Insertion & Deletion
Red Black Tree Insertion & DeletionRed Black Tree Insertion & Deletion
Red Black Tree Insertion & Deletion
 
Git for beginners
Git for beginnersGit for beginners
Git for beginners
 
Git commands
Git commandsGit commands
Git commands
 
van Emde Boas trees
van Emde Boas treesvan Emde Boas trees
van Emde Boas trees
 
Git Pull Requests
Git Pull RequestsGit Pull Requests
Git Pull Requests
 
Selection sort
Selection sortSelection sort
Selection sort
 
mykola marzhan - jenkins on aws spot instance
mykola marzhan - jenkins on aws spot instancemykola marzhan - jenkins on aws spot instance
mykola marzhan - jenkins on aws spot instance
 
BitBucket presentation
BitBucket presentationBitBucket presentation
BitBucket presentation
 
Linked list
Linked listLinked list
Linked list
 

En vedette

Стриминг и эффективное чтение с DVD диска
Стриминг и эффективное чтение с DVD дискаСтриминг и эффективное чтение с DVD диска
Стриминг и эффективное чтение с DVD дискаRoman_Lut
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокRoman_Lut
 
Архитектура современного 3 d движка: Разработка Xenus: Точка кипения
Архитектура современного 3 d движка: Разработка Xenus: Точка кипенияАрхитектура современного 3 d движка: Разработка Xenus: Точка кипения
Архитектура современного 3 d движка: Разработка Xenus: Точка кипенияRoman_Lut
 
Bloom filter
Bloom filterBloom filter
Bloom filterfeng lee
 
Probabilistic data structures. Part 3. Frequency
Probabilistic data structures. Part 3. FrequencyProbabilistic data structures. Part 3. Frequency
Probabilistic data structures. Part 3. FrequencyAndrii Gakhov
 
Probabilistic data structures. Part 2. Cardinality
Probabilistic data structures. Part 2. CardinalityProbabilistic data structures. Part 2. Cardinality
Probabilistic data structures. Part 2. CardinalityAndrii Gakhov
 
Implementing a Fileserver with Nginx and Lua
Implementing a Fileserver with Nginx and LuaImplementing a Fileserver with Nginx and Lua
Implementing a Fileserver with Nginx and LuaAndrii Gakhov
 
Probabilistic data structures. Part 4. Similarity
Probabilistic data structures. Part 4. SimilarityProbabilistic data structures. Part 4. Similarity
Probabilistic data structures. Part 4. SimilarityAndrii Gakhov
 
Data Mining - lecture 8 - 2014
Data Mining - lecture 8 - 2014Data Mining - lecture 8 - 2014
Data Mining - lecture 8 - 2014Andrii Gakhov
 
Apache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksApache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksAndrii Gakhov
 
Recurrent Neural Networks. Part 1: Theory
Recurrent Neural Networks. Part 1: TheoryRecurrent Neural Networks. Part 1: Theory
Recurrent Neural Networks. Part 1: TheoryAndrii Gakhov
 

En vedette (13)

Стриминг и эффективное чтение с DVD диска
Стриминг и эффективное чтение с DVD дискаСтриминг и эффективное чтение с DVD диска
Стриминг и эффективное чтение с DVD диска
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движок
 
14 Skip Lists
14 Skip Lists14 Skip Lists
14 Skip Lists
 
Архитектура современного 3 d движка: Разработка Xenus: Точка кипения
Архитектура современного 3 d движка: Разработка Xenus: Точка кипенияАрхитектура современного 3 d движка: Разработка Xenus: Точка кипения
Архитектура современного 3 d движка: Разработка Xenus: Точка кипения
 
Bloom filter
Bloom filterBloom filter
Bloom filter
 
Probabilistic data structures. Part 3. Frequency
Probabilistic data structures. Part 3. FrequencyProbabilistic data structures. Part 3. Frequency
Probabilistic data structures. Part 3. Frequency
 
Probabilistic data structures. Part 2. Cardinality
Probabilistic data structures. Part 2. CardinalityProbabilistic data structures. Part 2. Cardinality
Probabilistic data structures. Part 2. Cardinality
 
Implementing a Fileserver with Nginx and Lua
Implementing a Fileserver with Nginx and LuaImplementing a Fileserver with Nginx and Lua
Implementing a Fileserver with Nginx and Lua
 
Probabilistic data structures. Part 4. Similarity
Probabilistic data structures. Part 4. SimilarityProbabilistic data structures. Part 4. Similarity
Probabilistic data structures. Part 4. Similarity
 
skip list
skip listskip list
skip list
 
Data Mining - lecture 8 - 2014
Data Mining - lecture 8 - 2014Data Mining - lecture 8 - 2014
Data Mining - lecture 8 - 2014
 
Apache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksApache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected Talks
 
Recurrent Neural Networks. Part 1: Theory
Recurrent Neural Networks. Part 1: TheoryRecurrent Neural Networks. Part 1: Theory
Recurrent Neural Networks. Part 1: Theory
 

Similaire à Вероятностные структуры данных

Анализ количества посетителей на сайте [Считаем уникальные элементы]
Анализ количества посетителей на сайте [Считаем уникальные элементы]Анализ количества посетителей на сайте [Считаем уникальные элементы]
Анализ количества посетителей на сайте [Считаем уникальные элементы]Qrator Labs
 
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Ontico
 
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryИнтервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryTatyanazaxarova
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиЕвгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиFProg
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компиляторAndrew Aksyonoff
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоRoman Dvornov
 
Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)Mikhail Kurnosov
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
 
"Многомерные индексы в РСУБД с открытым кодом" Бородин Андрей , Октоника, УрФУ
"Многомерные индексы в РСУБД с открытым кодом" Бородин Андрей , Октоника, УрФУ"Многомерные индексы в РСУБД с открытым кодом" Бородин Андрей , Октоника, УрФУ
"Многомерные индексы в РСУБД с открытым кодом" Бородин Андрей , Октоника, УрФУit-people
 

Similaire à Вероятностные структуры данных (16)

Анализ количества посетителей на сайте [Считаем уникальные элементы]
Анализ количества посетителей на сайте [Считаем уникальные элементы]Анализ количества посетителей на сайте [Считаем уникальные элементы]
Анализ количества посетителей на сайте [Считаем уникальные элементы]
 
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
 
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryИнтервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиЕвгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
 
Purely practical data structures
Purely practical data structuresPurely practical data structures
Purely practical data structures
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компилятор
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
 
User Aggs In As
User Aggs In AsUser Aggs In As
User Aggs In As
 
"Многомерные индексы в РСУБД с открытым кодом" Бородин Андрей , Октоника, УрФУ
"Многомерные индексы в РСУБД с открытым кодом" Бородин Андрей , Октоника, УрФУ"Многомерные индексы в РСУБД с открытым кодом" Бородин Андрей , Октоника, УрФУ
"Многомерные индексы в РСУБД с открытым кодом" Бородин Андрей , Октоника, УрФУ
 

Plus de Andrii Gakhov

Let's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architectureLet's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architectureAndrii Gakhov
 
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...Andrii Gakhov
 
Too Much Data? - Just Sample, Just Hash, ...
Too Much Data? - Just Sample, Just Hash, ...Too Much Data? - Just Sample, Just Hash, ...
Too Much Data? - Just Sample, Just Hash, ...Andrii Gakhov
 
Pecha Kucha: Ukrainian Food Traditions
Pecha Kucha: Ukrainian Food TraditionsPecha Kucha: Ukrainian Food Traditions
Pecha Kucha: Ukrainian Food TraditionsAndrii Gakhov
 
Swagger / Quick Start Guide
Swagger / Quick Start GuideSwagger / Quick Start Guide
Swagger / Quick Start GuideAndrii Gakhov
 
API Days Berlin highlights
API Days Berlin highlightsAPI Days Berlin highlights
API Days Berlin highlightsAndrii Gakhov
 
ELK - What's new and showcases
ELK - What's new and showcasesELK - What's new and showcases
ELK - What's new and showcasesAndrii Gakhov
 
Apache Spark Overview @ ferret
Apache Spark Overview @ ferretApache Spark Overview @ ferret
Apache Spark Overview @ ferretAndrii Gakhov
 
Data Mining - lecture 7 - 2014
Data Mining - lecture 7 - 2014Data Mining - lecture 7 - 2014
Data Mining - lecture 7 - 2014Andrii Gakhov
 
Data Mining - lecture 6 - 2014
Data Mining - lecture 6 - 2014Data Mining - lecture 6 - 2014
Data Mining - lecture 6 - 2014Andrii Gakhov
 
Data Mining - lecture 5 - 2014
Data Mining - lecture 5 - 2014Data Mining - lecture 5 - 2014
Data Mining - lecture 5 - 2014Andrii Gakhov
 
Data Mining - lecture 4 - 2014
Data Mining - lecture 4 - 2014Data Mining - lecture 4 - 2014
Data Mining - lecture 4 - 2014Andrii Gakhov
 
Data Mining - lecture 3 - 2014
Data Mining - lecture 3 - 2014Data Mining - lecture 3 - 2014
Data Mining - lecture 3 - 2014Andrii Gakhov
 
Decision Theory - lecture 1 (introduction)
Decision Theory - lecture 1 (introduction)Decision Theory - lecture 1 (introduction)
Decision Theory - lecture 1 (introduction)Andrii Gakhov
 
Data Mining - lecture 2 - 2014
Data Mining - lecture 2 - 2014Data Mining - lecture 2 - 2014
Data Mining - lecture 2 - 2014Andrii Gakhov
 
Data Mining - lecture 1 - 2014
Data Mining - lecture 1 - 2014Data Mining - lecture 1 - 2014
Data Mining - lecture 1 - 2014Andrii Gakhov
 
Buzzwords 2014 / Overview / part2
Buzzwords 2014 / Overview / part2Buzzwords 2014 / Overview / part2
Buzzwords 2014 / Overview / part2Andrii Gakhov
 
Buzzwords 2014 / Overview / part1
Buzzwords 2014 / Overview / part1Buzzwords 2014 / Overview / part1
Buzzwords 2014 / Overview / part1Andrii Gakhov
 

Plus de Andrii Gakhov (20)

Let's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architectureLet's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architecture
 
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...
 
Too Much Data? - Just Sample, Just Hash, ...
Too Much Data? - Just Sample, Just Hash, ...Too Much Data? - Just Sample, Just Hash, ...
Too Much Data? - Just Sample, Just Hash, ...
 
DNS Delegation
DNS DelegationDNS Delegation
DNS Delegation
 
Pecha Kucha: Ukrainian Food Traditions
Pecha Kucha: Ukrainian Food TraditionsPecha Kucha: Ukrainian Food Traditions
Pecha Kucha: Ukrainian Food Traditions
 
Swagger / Quick Start Guide
Swagger / Quick Start GuideSwagger / Quick Start Guide
Swagger / Quick Start Guide
 
API Days Berlin highlights
API Days Berlin highlightsAPI Days Berlin highlights
API Days Berlin highlights
 
ELK - What's new and showcases
ELK - What's new and showcasesELK - What's new and showcases
ELK - What's new and showcases
 
Apache Spark Overview @ ferret
Apache Spark Overview @ ferretApache Spark Overview @ ferret
Apache Spark Overview @ ferret
 
Data Mining - lecture 7 - 2014
Data Mining - lecture 7 - 2014Data Mining - lecture 7 - 2014
Data Mining - lecture 7 - 2014
 
Data Mining - lecture 6 - 2014
Data Mining - lecture 6 - 2014Data Mining - lecture 6 - 2014
Data Mining - lecture 6 - 2014
 
Data Mining - lecture 5 - 2014
Data Mining - lecture 5 - 2014Data Mining - lecture 5 - 2014
Data Mining - lecture 5 - 2014
 
Data Mining - lecture 4 - 2014
Data Mining - lecture 4 - 2014Data Mining - lecture 4 - 2014
Data Mining - lecture 4 - 2014
 
Data Mining - lecture 3 - 2014
Data Mining - lecture 3 - 2014Data Mining - lecture 3 - 2014
Data Mining - lecture 3 - 2014
 
Decision Theory - lecture 1 (introduction)
Decision Theory - lecture 1 (introduction)Decision Theory - lecture 1 (introduction)
Decision Theory - lecture 1 (introduction)
 
Data Mining - lecture 2 - 2014
Data Mining - lecture 2 - 2014Data Mining - lecture 2 - 2014
Data Mining - lecture 2 - 2014
 
Data Mining - lecture 1 - 2014
Data Mining - lecture 1 - 2014Data Mining - lecture 1 - 2014
Data Mining - lecture 1 - 2014
 
Buzzwords 2014 / Overview / part2
Buzzwords 2014 / Overview / part2Buzzwords 2014 / Overview / part2
Buzzwords 2014 / Overview / part2
 
Buzzwords 2014 / Overview / part1
Buzzwords 2014 / Overview / part1Buzzwords 2014 / Overview / part1
Buzzwords 2014 / Overview / part1
 
Elasticsearch
ElasticsearchElasticsearch
Elasticsearch
 

Вероятностные структуры данных

  • 1. ferret go GmbH, Berlin Dr.Andrii Gakhov ВЕРОЯТНОСТНЫЕ СТРУКТУРЫ ДАННЫХ И ИХ ПРИМЕНЕНИЕ
  • 3. • Определить принадлежность элемента к множеству с большим числом элементов THE PROBLEM
  • 5. BLOOM FILTER • предложил Burton Howard Bloom, 1970 • Bloom filter это реализация вероятностного множества с 3 операциями: • добавить элемент в множество • проверить, что элемент принадлежит множеству • проверить, что элемент не принадлежит множеству • Bloom filter описывается 2 параметрами: • m - длина фильтра 
 (пропорциональна ожидаемому числу элементов n) • k - число различных хэш-функций
 (k намного меньше, чем m) • Bloom filter не хранит сами элементы и требует только 1 byte на единицу сохраненных данных
  • 6. BLOOM FILTER: ALGORITHM • Bloom filter представляет собой bit array длиной m bits, все элементы которого равны 0 в самом начале • Добавление элемента - вычислить значения всех k хэш- функций для данного элемента и установить биты с соответствующими индексами • Проверка принадлежности элемента - вычислить значения всех k хэш-функций для данного элемента и проверить биты с соответствующими индексами: • если все биты установлены, тогда ответ “может быть” • если хотя бы 1 бит установлен, тогда ответ “точно нет” • Время, необходимое для добавления элемента или его проверки, является постоянным O(k) и не зависит от количества элементов множества
  • 7. BLOOM FILTER: EXAMPLE • Рассмотрим Bloom filter длиной 16 bits (m=16) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 • Рассмотрим 2 хэш-функции (k=2): 
 MurmurHash3 и Fowler-Noll-Vo
 (соответствующие индексы вычисляются как mod 16) • Добавим элемент в фильтр: “ferret”:
 MurmurHash3(“ferret”) = 1, FNV(“ferret”) = 11 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
  • 8. BLOOM FILTER: EXAMPLE • Добавим элемент в фильтр: “bernau”:
 MurmurHash3(“bernau”) = 4, FNV(“bernau”) = 4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 • Проверим принадлежности элемента: “berlin”:
 MurmurHash3(“berlin”) = 4, FNV(“berlin”) = 12
 Bit 12 не установлен, следовательно “berlin” точно не принадлежит множеству • Проверим принадлежности элемента: “paris”:
 MurmurHash3(“paris”) = 11, FNV(“paris”) = 4
 Bits 4 и 11, следовательно элемент наверное принадлежит множеству (false positive)
  • 9. BLOOM FILTER: PROPERTIES • Возможны ложно-позитивные срабатывания
 (false positive - элемент не в множестве, но все биты установлены) • Ложно-негативные срабатывания не возможны • Хэш-функции должны быть независимые и равномерно распределенные. • Хэш-функции должны быть быстрыми в вычислении
 (не стоит использовать криптографические хэш-функции, как sha1) • При помощи выбора k и m можно уменьшить вероятность ложно-позитивного срабатывания. P e ∈ℑ| e ∉ℑ( ) ≈ 1− e kn m ⎛ ⎝⎜ ⎞ ⎠⎟ k P e ∉ℑ| e ∈ℑ( )= 0 k∗ = m n ln2
  • 10. BLOOM FILTER: APPLICATIONS • Google BigTable, Apache HBase и Apache Cassandra используют Bloom filters для уменьшения операций проверки диска для несуществующих строк и столбцов • Medium использует Bloom filters, чтобы рекомендовать статьи, которые читатель ранее не читал • Google Chrome web browser использовал Bloom filter для проверки URL по базе известных вредоносных сайтов (заменено на PrefixSet, Issue 71832) • Squid Web Proxy Cache исползует Bloom filters для управления кешированием
  • 11. BLOOM FILTER: PROBLEMS • Классический Bloom filter не поддерживает операцию удаления. • Bloom filters работаю хорошо, пока они помещаются в память • ~1 byte на элемент (3x-4x больше для Counting Bloom filters, поддерживающих удаление) • Что происходит когда Bloom filters не помещаются в память? • На обычных магнитных дисках Bloom filters умирают. Обычный диск поддерживает только 100–200 (random) I/Os в секунду, а каждая операция с Bloom filter требует множество I/Os. • На SSD дисках Bloom filters менее производительны - в 10000 раз медленнее, чем в памяти. • Буферизация может помочь, но возникают проблемы из-за масштабирования, уменьшающие эффект буфферизации.
  • 12. BLOOM FILTER: VARIANTS • Attenuated Bloom filters используют массивы фильтров для вычисления кратчайших путей • Spectral Bloom filters используются для оценки частот элементов. • Counting Bloom Filters являются раширением классического варианта, поддерживающим операцию удаления. Вместо одного бита, они используют счетчик элементов, который увеличивается при кадой операции добавления и уменьшается при удалении. • Compressed Bloom filters предназначены для оптимизации размера фильтра при сохранении приемлемой вероятности ошибки. • Bloom Filter Cascade реализуют фильтрацию через каскад из Bloom filters. • Scalable Bloom Filters могут динамически адаптироваться к количеству сохраненных элементов, поддерживая требуемую оценку вероятности ошибки.
  • 13. BLOOM FILTER: PYTHON • https://github.com/jaybaird/python-bloomfilter
 pybloom is a module that includes a Bloom Filter data structure along with an implementation of Scalable Bloom Filters • https://github.com/seomoz/pyreBloom
 pyreBloom provides Redis backed Bloom Filter using GETBIT and SETBIT
  • 14. BLOOM FILTER: READ MORE • http://dmod.eu/deca/ft_gateway.cfm.pdf • https://en.wikipedia.org/wiki/Bloom_filter • https://www.cs.uchicago.edu/~matei/PAPERS/bf.doc • http://gsd.di.uminho.pt/members/cbm/ps/dbloom.pdf • https://www.eecs.harvard.edu/~michaelm/postscripts/ im2005b.pdf
  • 16. • Определить частоту элемента в множестве THE PROBLEM
  • 18. COUNT-MIN SKETCH • предложен G. Cormode, S. Muthukrishnan в 2003 • CM Sketch это сублинейная пространственная структура данных, поддерживающая 2 операции: • добавление элемента • подсчет сколько раз элемент был добавлен (частота) • Count-Min Sketch описывается 2 параметрами: • m - число “ячеек” 
 (независимо от n, но намного меньше) • k - число различных хэш-функций со значениям 1…m
 (k намного меньше m) • CM Sketch занимает ограниченно пространство: m*k счетчиков и k хэш-функций
  • 19. COUNT-MIN SKETCH: ALGORITHM • Count-Min Sketch это просто матрица из счетчиков (все равны 0), где каждая строка соответсвует определенней хэш-функции hi, i=1…k • Добавление элемента - вычислить значения всех k хэш-функций и увеличить счетчики на позициях [i, hi(element)], i=1…k • Вычисление частоты элемента - вычислить значения всех k хэш- функций и вернуть минимальное из значений счетчиков на позициях [i, hi(element)], i=1…k. • ВАЖНО: Из-за возможных коллизий (soft collisions) мы имеем k (разных) оценок настоящей частоты элемента, но т.к. мы никогда не уменьшаем счетчик, эти оценки могут быть только больше или равны частоте. • Время добавления или вычисления частоты элемента фиксировано O(k) при условии, что все хэш-функции могут быть вычислены на постоянное время.
  • 20. COUNT-MIN SKETCH: EXAMPLE • Рассмотрим CM Sketch с 16 столбцами (m=16) • Рассмотрим 2 хэш-функции(k=2):
 h1 - MurmurHash3 и h2 - Fowler-Noll-Vo
 (соответствующие индексы вычисляются как mod 16) • Добавим элемент: “berlin”
 h1(“berlin”) = 4, h2(“berlin”) = 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 01 2 0
  • 21. COUNT-MIN SKETCH: EXAMPLE • Добавим элемент “berlin”еще 5 раз: • Добавим элемент “bernau”: h1(“bernau”) = 4, h2(“bernau”) = 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 01 2 0 • Добавим элемент “paris”: h1(“paris”) = 11, h2(“paris”) = 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 1 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 01 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 2 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 1 0 0 0 01 2 0
  • 22. COUNT-MIN SKETCH: EXAMPLE • Вычислим частоту: “london”:
 h1(“london”) = 7, h2(“london”) = 4
 freq(“london”) = min (0, 2) = 0 • Вычислим частоту: “berlin”:
 h1(“berlin”) = 4, h2(“berlin”) = 12
 freq(“berlin”) = min (7, 6) = 6 • Вычислим частоту: “warsaw”:
 h1(“warsaw”) = 4, h2(“warsaw”) = 12
 freq(“warsaw”) = min (7, 6) = 6 !!! due to hash collision 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 2 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 1 0 0 0 01 2 0
  • 23. COUNT-MIN SKETCH: PROPERTIES • Count-Min Sketch возвращает только оценку сверху • Для достижения вероятности ошибки δ, необходимо выбрать k ≥ ln 1/δ. • для δ около 1%, k = 5 - достаточно • Count-Min Sketch фактически является такой же структурой как и Counting Bloom filter. 
 Разница задается только их назначением: • Count-Min Sketch имеет сублинейное число ячеек, в соответствии с выбранной точностью, но независимо от ожидаемого числа элементов в множестве • Counting Bloom filter имеет размер в зависимости от ожидаемого числа элементов в множестве.
  • 24. COUNT-MIN SKETCH: APPLICATIONS • AT&T использует Count-Min Sketch в сетевых коммутаторах для анализа трафика в условиях ограниченной памяти • Google использует “count sketch” (предшественник count-min sketch) в своей инфраструктуре параллельного вычисления MapReduce • Реализован как часть библиотеки Algebird от Twitter
  • 25. COUNT-MIN SKETCH: PYTHON • https://github.com/rafacarrascosa/countminsketch
 CountMinSketch is a minimalistic Count-min Sketch in pure Python • https://github.com/farsightsec/fsisketch
 FSI Sketch a disk-backed implementation of the Count- Min Sketch algorithm
  • 26. COUNT-MIN SKETCH: READ MORE • http://dimacs.rutgers.edu/~graham/pubs/papers/cm- latin.pdf • http://dimacs.rutgers.edu/~graham/pubs/papers/ cmencyc.pdf • http://dimacs.rutgers.edu/~graham/pubs/papers/ cmsoft.pdf • http://theory.stanford.edu/~tim/s15/l/l2.pdf • http://www.cs.dartmouth.edu/~ac/Teach/CS49-Fall11/ Notes/lecnotes.pdf
  • 28. • Найти число различных элементов (мощность) в множестве с большим числом элементов THE PROBLEM
  • 30. LINEAR COUNTING: ALGORITHM • Линейный счетчик это битовый массив (хэш- таблица) размера m (все равны 0). • Алгоритм состоит из нескольких шагов: • для каждого элемента множества вычислить значение хэш-функции и установить соответствующий бит • вычислить долю V пустых битов в структуре
 (отношение числа пустых битов к размеру счетчика m ) • вычислить оценку мощности множества как
 n ≈ -m ln V
  • 31. LINEAR COUNTING: EXAMPLE 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 • Рассмотрим 16-битный линейный счетчик (m=16) • Рассмотрим MurmurHash3 в качестве хэш-функции h
 (соответствующие индексы вычисляются как mod 16) • Добавим 10 элементов в множество: “bernau”, “bernau”, “bernau”, “berlin”, “kiev”, “kiev”, “new york”, “germany”, “ukraine”, “europe” (мощность данного множества n = 7) h(“bernau”) = 4, h(“berlin”) = 4, h(“kiev”) = 6, h(“new york”) = 6, h(“germany”) = 14, h(“ukraine”) = 7, h(“europe”) = 9 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0
  • 32. LINEAR COUNTING: EXAMPLE число пустых битов: 11 m = 16 V = 11 / 16 = 0.6875 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 • Оценка мощности множества n ≈ - 16 * ln (0.6875) = 5.995
  • 33. LINEAR COUNTING: READ MORE • http://dblab.kaist.ac.kr/Prof/pdf/Whang1990(linear).pdf • http://www.codeproject.com/Articles/569718/ CardinalityplusEstimationplusinplusLinearplusTimep
  • 35. • Найти похожие множества (документы) в коллекции THE PROBLEM
  • 37. SIMILARITY • Как правило, в задачах информационного поиска (Information Retrival, IR) возникает необходимость оценки подобия документов • Документ может быть представлен набором своих слов (“bag of words”) и рассматриваться как множество элементов некоего универсального множества слов, составляющих все документы коллекции • Jaccard similarity для двух множеств A и B: JS = A ∩ B A ∪ B
  • 38. MINHASH: MATRIX REPRESENTATION • Коллекция множеств может быть представлена для наглядности как характеристическая матрица C. • Столбцы матрицы соответствуют множествам, а строки - элементам универсального множества всех элементов, из которых состоят множества • C(r, c) =1 если элемент в строке r принадлежит множеству в столбце c, иначе C(r,c) =0 • ВАЖНО: Характеристическая матрица не используется для непосредственного хранения данных - только для из представления. • Одной из причин этого - разреженность матрицы в большинстве случаев.
  • 39. MINHASH: MATRIX REPRESENTATION • Рассмотрим коллекцию множеств (документов, представленные токенами): • S1 = {python, is, a, programming, language} • S2 = {java, is, a, programming, language} • S3 = {a, programming, language} • S4 = {python, is, a, snake} • Характеристическая матрица имеет вид: row S1 S2 S3 S4 a 0 1 1 1 1 is 1 1 1 0 1 java 2 0 1 0 0 language 3 1 1 1 0 programming 4 1 1 1 0 python 5 1 0 0 1 snake 6 0 0 0 1
  • 40. MINHASH: INTUITION • Значение minhash для каждого столбца характеристической матрицы - значение индекса первой строки в перестановке, при которой в столбце стоит 1 • Для вычисления minhash для всей коллекции (представленной такими столбцами), необходимо выбрать перестановки строк. • Для большой характеристической матрицы это не достижимо за ограниченное время, т.к. приходится выбирать миллионы и миллиарды строк (это даже без учета сортировки). • Можно смоделировать эффект случайных перестановок, путем выбора случайных хэш-функций, которые отображают индексы строк в количество ячеек, равному количеству столбцов. • Вместо выбора n случайных перестановок столбцов, достаточно вычислить n случайно выбранных хэш-функций h1, h2, . . . , hn для индексов строк
  • 41. MINHASH: ALGORITHM • Выбрать n хэш-функций h1, h2, . . . , hn • Для каждого множества из коллекции S (для каждого столбца), вычислить значение хэш-функций - вектор [h1(S), h1(S), . . . , h1(S)]. • Построить характеристическую матрицу C коллекции. • Построить матрицу сигнатур SIG, где SIG(i, c) соответсвует i й хэш- функции и столбцу c. Сначала все SIG(i, c) = ∞ для каждого i и c. • Для каждой строки r: • Вычислить h1(r), h2(r), . . . , hn(r) • Для каждого столбца c: • Если C(r,c) = 1, тогда SIG(i, c) = min{SIG(i,c), hi(r)} для i = 1..n • Оценить подобие между множествами используя финальную версию матрицы сигнатур
  • 42. MINHASH: PROPERTIES • Связь между minhash и Jaccard similarity: • Вероятность того, что функция minhash для случайной перестановки строк вернет одинаковое значение для двух множеств равна значению Jaccard similarity этих множеств
  • 43. MINHASH: EXAMPLE • Рассмотрим 2 хэш-функции: • h1(x) = x + 1 mod 7 • h2(x) = 3x + 1 mod 7 row S1 S2 S3 S4 h1(row) h2 (row) a 0 1 1 1 1 1 1 is 1 1 1 0 1 2 4 java 2 0 1 0 0 3 0 language 3 1 1 1 0 4 3 programming 4 1 1 1 0 5 6 python 5 1 0 0 1 6 2 snake 6 0 0 0 1 0 5 • Рассмотрим ту же самую коллекцию из 4 документов и 7 слов
  • 44. MINHASH: EXAMPLE S1 S2 S3 S4 h1 ∞ ∞ ∞ ∞ h2 ∞ ∞ ∞ ∞ • Сначала все значения равны ∞: • На первом шаге рассмотрим строку 0, ее сигнатуры равны h1(0)=h2(0)=1. Все документы имеют 1 в данной строке - следовательно, мы вносим значения h1 и h2 в матрицу сигнатур: r S1 S2 S3 S4 h1 h2 0 1 1 1 1 1 1 1 1 1 0 1 2 4 2 0 1 0 0 3 0 3 1 1 1 0 4 3 4 1 1 1 0 5 6 5 1 0 0 1 6 2 6 0 0 0 1 0 5 S1 S2 S3 S4 h1 1 1 1 1 h2 1 1 1 1 • Далее, рассмотрим строку 1, ее сигнатуры равны h1(1) = 2 и h2(1) = 4. В данной строке только S1, S2 и S4 имеют 1, поэтому только для этих столбцов мы обновляет сигнатуры - равные минимуму между существующем значением и значениями h1(1) = 2 и h2(1) = 4 соответственно: S1 S2 S3 S4 h1 2 2 1 2 h2 4 4 1 4
  • 45. MINHASH: EXAMPLE S1 S2 S3 S4 h1 2 2 1 2 h2 2 0 1 2 • Продолжаем с остальными строками и после строки с индексом 5 матрица имеет вид • Наконец, рассмотрим строку 6, ее сигнатуры равны h1(6) = 0 и h2(6) = 5. В этой строке только S4 имеет 1, следовательно, обновляем только значения в этом столбце, устанавливая их минимуму существующего значения и 0 для h1 или 5 для h2. Итоговая матрица сигнатур имеет вид: S1 S2 S3 S4 h1 2 2 1 0 h2 2 0 1 2 r S1 S2 S3 S4 h1 h2 0 1 1 1 1 1 1 1 1 1 0 1 2 4 2 0 1 0 0 3 0 3 1 1 1 0 4 3 4 1 1 1 0 5 6 5 1 0 0 1 6 2 6 0 0 0 1 0 5 • Нет полностью идентичных документов в коллекции. • Документы S1 и S2 согласуются по половине сигнатур, т.е. их коэффициент подобия равен 0.5 (точное значение JS = 0.66) • Документы S1 и S4 тоже согласуются по половине сигнатур, т.е. их коэффициент подобия равен 0.5 (точное значение JS = 0.33) • Документы S3 и S4 не согласуются по сигнатурам, т.е. их коэффициент подобия равен 0 (точное значение JS = 0.16666…)
  • 46. MINHASH: PYTHON • https://github.com/ekzhu/datasketch
 datasketch gives you probabilistic data structures that can process vary large amount of data • https://github.com/anthonygarvan/MinHash
 MinHash is an effective pure python implementation of Minhash
  • 47. MINHASH: READ MORE • http://infolab.stanford.edu/~ullman/mmds/book.pdf • http://www.cs.cmu.edu/~guyb/realworld/slidesS13/ minhash.pdf • https://en.wikipedia.org/wiki/MinHash • http://www2007.org/papers/paper570.pdf • https://www.cs.utah.edu/~jeffp/teaching/cs5955/L4- Jaccard+Shingle.pdf
  • 48. ▸ @gakhov ▸ linkedin.com/in/gakhov ▸ www.datacrucis.com THANK YOU