Фильтр Блума — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Источники)
(Описание структуры данных)
Строка 7: Строка 7:
 
[[Файл:bloom_filter.png|thumb|360px|Пример фильтра Блума с <tex>m = 9</tex> и <tex>k = 3</tex>, хранящего множество из  элементов <tex>A</tex> и <tex>B</tex>. Цветные стрелки указывают на места в битовом массиве, соответствующие каждому элементу множества. Этот фильтр Блума может определить, что элемент <tex>C</tex> входит в множество, хотя он и не добавлен в него.]]
 
[[Файл:bloom_filter.png|thumb|360px|Пример фильтра Блума с <tex>m = 9</tex> и <tex>k = 3</tex>, хранящего множество из  элементов <tex>A</tex> и <tex>B</tex>. Цветные стрелки указывают на места в битовом массиве, соответствующие каждому элементу множества. Этот фильтр Блума может определить, что элемент <tex>C</tex> входит в множество, хотя он и не добавлен в него.]]
  
Фильтр Блума представляет собой битовый массив из <tex>m</tex> бит. Изначально, когда структура данных хранит пустое множество, все <tex>m</tex> бит обнулены. Далее определяются <tex>k</tex> независимых хеш-функций <tex>h_1</tex>, …, <tex>h_k</tex>, отображающих каждый элемент в одну из <tex>m</tex> позиций битового массива достаточно равномерным образом.
+
Фильтр Блума представляет собой битовый массив из <tex>m</tex> бит и <tex>k</tex> различных хеш-функций <tex>h_1 \dots h_k</tex>, равновероятно отображающих элементы исходного множества во множество <tex> \big\{ 0, 1, \dots m - 1 \big\}</tex>, соответствующее номерам битов в массиве.
 +
Изначально, когда структура данных хранит пустое множество, все <tex>m</tex> бит обнулены.
  
Для добавления элемента <tex>e</tex> необходимо записать единицы на каждую из позиций <tex>h_1(e)</tex>, …, <tex>h_k(e)</tex> битового массива.
+
Для добавления элемента <tex> e </tex> необходимо записать единицы на каждую из позиций <tex>h_1(e) \dots h_k(e)</tex> битового массива.
  
Чтобы проверить что элемент <tex>e</tex> принадлежит множеству хранимых элементов, необходимо проверить состояние битов <tex>h_1(e)</tex>, …, <tex>h_k(e)</tex>. Если хотя бы один из них равен нулю, элемент не принадлежит множеству. Если все они равны единице, то структура данных сообщает, что элемент принадлежит множеству. При этом может возникнуть две ситуации: либо элемент действительно принадлежит к множеству, либо все эти биты оказались установлены по случайности при добавлении других элементов, что и является источником ложных срабатываний в этой структуре данных.
+
Чтобы проверить что элемент <tex>e</tex> принадлежит множеству хранимых элементов, необходимо проверить состояние битов <tex> h_1(e) \dots h_k(e) </tex>. Если хотя бы один из них равен нулю, элемент не принадлежит множеству. Если все они равны единице, то структура данных сообщает, что элемент принадлежит множеству. При этом может возникнуть две ситуации: либо элемент действительно принадлежит к множеству, либо все эти биты оказались установлены по случайности при добавлении других элементов, что и является источником ложных срабатываний в этой структуре данных.
  
 
== Минимизация вероятности ложноположительного срабатывания ==
 
== Минимизация вероятности ложноположительного срабатывания ==

Версия 01:04, 30 апреля 2012

Фильтр Блума — это структура данных, придуманная Бёртоном Блумом в 1970 году, позволяющая компактно хранить множество элементов и проверять принадлежность заданного элемента к множеству. При этом существует возможность получить ложноположительное срабатывание(элемента в множестве нет, но структура данных сообщает, что он есть), но не ложноотрицательное.

Фильтр Блума может использовать любой объём памяти, заранее заданный пользователем, причем чем он больше, тем меньше вероятность ложного срабатывания. Поддерживается операция добавления новых элементов в множество, но не удаления существующих (если только не используется модификация со счётчиками). С увеличением размера хранимого множества повышается вероятность ложного срабатывания.

Описание структуры данных

Пример фильтра Блума с [math]m = 9[/math] и [math]k = 3[/math], хранящего множество из элементов [math]A[/math] и [math]B[/math]. Цветные стрелки указывают на места в битовом массиве, соответствующие каждому элементу множества. Этот фильтр Блума может определить, что элемент [math]C[/math] входит в множество, хотя он и не добавлен в него.

Фильтр Блума представляет собой битовый массив из [math]m[/math] бит и [math]k[/math] различных хеш-функций [math]h_1 \dots h_k[/math], равновероятно отображающих элементы исходного множества во множество [math] \big\{ 0, 1, \dots m - 1 \big\}[/math], соответствующее номерам битов в массиве. Изначально, когда структура данных хранит пустое множество, все [math]m[/math] бит обнулены.

Для добавления элемента [math] e [/math] необходимо записать единицы на каждую из позиций [math]h_1(e) \dots h_k(e)[/math] битового массива.

Чтобы проверить что элемент [math]e[/math] принадлежит множеству хранимых элементов, необходимо проверить состояние битов [math] h_1(e) \dots h_k(e) [/math]. Если хотя бы один из них равен нулю, элемент не принадлежит множеству. Если все они равны единице, то структура данных сообщает, что элемент принадлежит множеству. При этом может возникнуть две ситуации: либо элемент действительно принадлежит к множеству, либо все эти биты оказались установлены по случайности при добавлении других элементов, что и является источником ложных срабатываний в этой структуре данных.

Минимизация вероятности ложноположительного срабатывания

Пусть размер битового массива [math]m[/math] и задано [math]k[/math] хеш-функций таких, что каждая из них назначает место элементу [math]x[/math] в битовом массиве с равной вероятностью:

[math]Pr(h_i(x) = t) = \frac 1m [/math], где [math]t = 1 .. m[/math]

Тогда вероятность того, что в некоторый p-й бит не будет записана единица во время операции вставки очередного элемента равна:

[math]Pr(h_i(x) \ne p)^k = (1 - \frac 1m)^k [/math]

А вероятность того, что p-й бит останется равным нулю после вставки n различных элементов:

[math](1 - \frac 1m)^{kn} [/math]

В силу второго замечательного предела и достаточно большого m можем это записать как:

[math]e^{-kn/m}[/math]

Ложноположительное срабатывание происходит тогда, когда для несуществующего элемента все [math]k[/math] бит окажутся ненулевыми, и фильтр Блума ответит, что он входит в число вставленных элементов. Вероятность такого события тогда равна:

[math](1 - e^{-kn/m})^k[/math]

Для фиксированных m и n, оптимальное число хеш-функций k, минимизирующих вероятность ложноположительного срабатывания, равно:

[math]k = \frac mn ln(2) [/math]

Свойства

Фильтр Блума может хранить универсальное множество всех возможных элементов. При этом все ячейки битового массива будут содержать 1.

При существование двух фильтров Блума одинаковых размеров и с одинаковыми наборами хеш-функций, их объединение и пересечение может быть реализовано побитовыми операциями OR и AND.

Источники