|
| 1 | +# Фильтр Блума |
| 2 | + |
| 3 | +**Фильтр Блума** - это пространственно-эффективная вероятностная структура данных, созданная для проверки наличия элемента |
| 4 | +в множестве. Он спроектирован невероятно быстрым при минимальном использовании памяти ценой потенциальных ложных срабатываний. |
| 5 | +Существует возможность получить ложноположительное срабатывание (элемента в множестве нет, но структура данных сообщает, |
| 6 | +что он есть), но не ложноотрицательное. Другими словами, очередь возвращает или "возможно в наборе", или "определённо не |
| 7 | +в наборе". Фильтр Блума может использовать любой объём памяти, однако чем он больше, тем меньше вероятность ложного |
| 8 | +срабатывания. |
| 9 | + |
| 10 | +Блум предложил эту технику для применения в областях, где количество исходных данных потребовало бы непрактично много |
| 11 | +памяти, в случае применения условно безошибочных техник хеширования. |
| 12 | + |
| 13 | +## Описание алгоритма |
| 14 | + |
| 15 | +Пустой фильтр Блума представлен битовым массивом из `m` битов, все биты которого обнулены. Должно быть определено `k` |
| 16 | +независимых хеш-функций, отображающих каждый элемент множества в одну из `m` позиций в массиве, генерируя единообразное |
| 17 | +случайное распределение. Обычно `k` задана константой, которая много меньше `m` и пропорциональна |
| 18 | +количеству добавляемых элементов; точный выбор `k` и постоянной пропорциональности `m` определяются уровнем ложных |
| 19 | +срабатываний фильтра. |
| 20 | + |
| 21 | +Вот пример Блум фильтра, представляющего набор `{x, y, z}`. Цветные стрелки показывают позиции в битовом массиве, |
| 22 | +которым привязан каждый элемент набора. Элемент `w` не в набора `{x, y, z}`, потому что он привязан к позиции в битовом |
| 23 | +массиве, равной `0`. Для этой формы , `m = 18`, а `k = 3`. |
| 24 | + |
| 25 | + |
| 26 | +Фильтр Блума представляет собой битовый массив из `m` бит. Изначально, когда структура данных хранит пустое множество, все |
| 27 | +`m` бит обнулены. Пользователь должен определить `k` независимых хеш-функций `h1`, …, `hk`, |
| 28 | +отображающих каждый элемент в одну из `m` позиций битового массива достаточно равномерным образом. |
| 29 | + |
| 30 | +Для добавления элемента e необходимо записать единицы на каждую из позиций `h1(e)`, …, `hk(e)` |
| 31 | +битового массива. |
| 32 | + |
| 33 | +Для проверки принадлежности элемента `e` к множеству хранимых элементов, необходимо проверить состояние битов |
| 34 | +`h1(e)`, …, `hk(e)`. Если хотя бы один из них равен нулю, элемент не может принадлежать множеству |
| 35 | +(иначе бы при его добавлении все эти биты были установлены). Если все они равны единице, то структура данных сообщает, |
| 36 | +что `е` принадлежит множеству. При этом может возникнуть две ситуации: либо элемент действительно принадлежит множеству, |
| 37 | +либо все эти биты оказались установлены по случайности при добавлении других элементов, что и является источником ложных |
| 38 | +срабатываний в этой структуре данных. |
| 39 | + |
| 40 | + |
| 41 | + |
| 42 | +## Применения |
| 43 | + |
| 44 | +Фильтр Блума может быть использован для блогов. Если цель состоит в том, чтобы показать читателям только те статьи, |
| 45 | +которые они ещё не видели, фильтр блума идеален. Он может содержать хешированные значения, соответствующие статье. После |
| 46 | +того, как пользователь прочитал несколько статей, они могут быть помещены в фильтр. В следующий раз, когда пользователь |
| 47 | +посетит сайт, эти статьи могут быть убраны из результатов с помощью фильтра. |
| 48 | + |
| 49 | +Некоторые статьи неизбежно будут отфильтрованы по ошибке, но цена приемлема. То, что пользователь не увидит несколько |
| 50 | +статей в полне приемлемо, принимая во внимание тот факт, что ему всегда показываются другие новые статьи при каждом |
| 51 | +новом посещении. |
| 52 | + |
| 53 | +## Ссылки |
| 54 | + |
| 55 | +- [Wikipedia](https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%91%D0%BB%D1%83%D0%BC%D0%B0) |
| 56 | +- [Фильтр Блума на Хабре](https://habr.com/ru/post/112069/) |
0 commit comments