Зозулин фільтр
Зозулин фільтр (англ. cuckoo filter) — це імовірнісна структура даних, яка використовується для перевірки того, чи елемент належить до множини, подібно до фільтр Блума . Хибно позитивні збіги можливі, але не хибно негативні – іншими словами, запит повертає «можливо в наборі» або «безумовно не в наборі». Зозулин фільтр, дозволяє видаляти наявні елементи, що не можливо з використанням фільтра Блума. Крім того, для додатків, які зберігають багато елементів і орієнтовані на помірно низьку долю хибно-позитивних результатів, фільтри зозулі можуть досягти меншого використання пам'яті, ніж оптимізовані по пам'яті фільтри Блума[1].
Зозулині фільтри були вперше описані в 2014 році [2]
Опис алгоритму
У фільтрі зозулі використовується -канальна множинно-асоціативна хеш-таблиця на основі хешування зозулі для зберігання цифрових відбитків усіх елементів (кожна корзина хеш-таблиці може зберігати до записів).
Зокрема, два індекси потенційних корзин і в таблиці для певного елемента обчислюються за допомогою двох хеш-функцій (має назву хешування с частковим ключем, Шаблон:Lang-en)[2] ):
Застосування двох вищезазначених хеш-функцій для побудови зозулиної хеш-таблиці дає змогу переміщувати елементи лише на основі цифрових відбитків, в умовах коли отримати оригінальний елемент неможливо. Як наслідок, під час вставки нового елемента, який вимагає переміщення існуючого елемента , інше можливе розташування для елемента , витісненого з корзини розраховується за формулою
Базуючись на хешуванні зозулі з частковим ключем, хеш-таблиця може досягти як високого рівня використання (завдяки хешуванню зозулі), так і компактності, оскільки зберігаються лише цифрові відбитки. Операції пошуку та видалення для фільтра зозулі прості. Існує максимум два місця і , які варто перевірити. Якщо елемент знайдено, відповідна операція пошуку або видалення може бути виконана за час . Більше теоретичного аналізу фільтрів зозулі можна знайти в літературі[3][4].
Порівняння з фільтрами Блума
Зозулин фільтр подібний до фільтра Блума тим, що вони обидва дуже швидкі та компактні, і обидва вони можуть повертати хибно позитивні результати:
- Оптимальних по пам'яті фільтри Блума використовують біт місця для кожного вставленого ключа, де це коефіцієнт хибно позитивних результатів. Зозулиному фільтру необхідно де це коефіцієнт завантаження хеш-таблиці, який може бути на основі налаштувань зозулиного фільтра. Варто зазначити, що теоретична нижня межа об'єму пам'яті складає бітів для кожного елемента.
- При позитивному пошуку оптимальний для пам'яті фільтр Блума вимагає константно операцій звернення до бітового масиву, тоді як зозулин фільтр потребує щонайбільше двох таких операції.
- Після досягнення порогового значення навантаження швидкість вставки до фільтра зозулі може деградувати. В такому випадку рекомендується розширення таблиці. Навпроти, фільтри Блума можуть продовжувати вставляти нові елементи без розширення таблиці, але це можливо ціною отримання вищого рівня хибно позитивних результатів.
Обмеження
- Зозулин фільтр може видаляти лише елементи, про які відомо, що вони були вставлені раніше.
- Вставка може бути невдалою, в такому випадку хешування потрібно проводити наново. Варто зазначити, що амортизована складність вставки залишається . [5]