|
| 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 | +Фільтр Блума є бітовий масив з `m` біт. Спочатку, коли структура даних зберігає порожню множину, всі |
| 26 | +m біт обнулені. Користувач повинен визначити `k` незалежних хеш-функцій `h1`, …, `hk`, |
| 27 | +що відображають кожен елемент в одну з m позицій бітового масиву досить рівномірним чином. |
| 28 | + |
| 29 | +Для додавання елемента e необхідно записати одиниці на кожну з позицій `h1(e)`, …, `hk(e)` |
| 30 | +бітового масиву. |
| 31 | + |
| 32 | +Для перевірки приналежності елемента `e` до безлічі елементів, що зберігаються, необхідно перевірити стан бітів |
| 33 | +`h1(e)`, …, `hk(e)`. Якщо хоча б один з них дорівнює нулю, елемент не може належати множині |
| 34 | +(інакше при його додаванні всі ці біти були встановлені). Якщо вони рівні одиниці, то структура даних повідомляє, |
| 35 | +що `е` належить безлічі. При цьому може виникнути дві ситуації: або елемент дійсно належить множині, |
| 36 | +або всі ці біти виявилися встановлені випадково при додаванні інших елементів, що і є джерелом помилкових |
| 37 | +спрацьовувань у цій структурі даних. |
| 38 | + |
| 39 | + |
| 40 | + |
| 41 | +## Застосування |
| 42 | + |
| 43 | +Фільтр Блума може бути використаний для блогів. Якщо мета полягає в тому, щоб показати читачам лише ті статті, |
| 44 | +які вони ще не бачили, фільтр блуму ідеальний. Він може містити значення, що хешуються, відповідні статті. Після |
| 45 | +того, як користувач прочитав кілька статей, вони можуть бути поміщені у фільтр. Наступного разу, коли користувач |
| 46 | +відвідає сайт, ці статті можуть бути вилучені з результатів за допомогою фільтра. |
| 47 | + |
| 48 | +Деякі статті неминуче будуть відфільтровані помилково, але ціна прийнятна. Те, що користувач не побачить дещо |
| 49 | +статей цілком прийнятно, беручи до уваги той факт, що йому завжди показуються інші нові статті при кожному |
| 50 | +новому відвідуванні. |
| 51 | + |
| 52 | +## Посилання |
| 53 | + |
| 54 | +- [Wikipedia](https://uk.wikipedia.org/wiki/%D0%A4%D1%96%D0%BB%D1%8C%D1%82%D1%80_%D0%91%D0%BB%D1%83%D0%BC%D0%B0) |
0 commit comments