| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent e286a92 commit 43e1cca
2 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,5 +1,8 @@ | |||
| 1 | 1 | # Bloom Filter | |
| 2 | 2 | ||
| 3 | + _Read this in other languages:_ | ||
| 4 | + [_Русский_](README.ru-RU.md) | ||
| 5 | + | ||
| 3 | 6 | A **bloom filter** is a space-efficient probabilistic | |
| 4 | 7 | data structure designed to test whether an element | |
| 5 | 8 | is present in a set. It is designed to be blazingly | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,56 @@ | |||
| 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/) | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments