Зозулин фільтр

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Зозулин фільтр (англ. cuckoo filter) — це імовірнісна структура даних, яка використовується для перевірки того, чи елемент належить до множини, подібно до фільтр Блума . Хибно позитивні збіги можливі, але не хибно негативні – іншими словами, запит повертає «можливо в наборі» або «безумовно не в наборі». Зозулин фільтр, дозволяє видаляти наявні елементи, що не можливо з використанням фільтра Блума. Крім того, для додатків, які зберігають багато елементів і орієнтовані на помірно низьку долю хибно-позитивних результатів, фільтри зозулі можуть досягти меншого використання пам'яті, ніж оптимізовані по пам'яті фільтри Блума[1].

Зозулині фільтри були вперше описані в 2014 році [2]

Опис алгоритму[ред. | ред. код]

У фільтрі зозулі використовується -канальна множинно-асоціативна хеш-таблиця на основі хешування зозулі для зберігання цифрових відбитків усіх елементів (кожна корзина хеш-таблиці може зберігати до записів).

Зокрема, два індекси потенційних корзин і  в таблиці для певного елемента обчислюються за допомогою двох хеш-функцій (має назву хешування с частковим ключем, англ. partial-key cuckoo hashing)[2] ):


Застосування двох вищезазначених хеш-функцій для побудови зозулиної хеш-таблиці дає змогу переміщувати елементи лише на основі цифрових відбитків, в умовах коли отримати оригінальний елемент неможливо. Як наслідок, під час вставки нового елемента, який вимагає переміщення існуючого елемента , інше можливе розташування для елемента , витісненого з корзини розраховується за формулою

Базуючись на хешуванні зозулі з частковим ключем, хеш-таблиця може досягти як високого рівня використання (завдяки хешуванню зозулі), так і компактності, оскільки зберігаються лише цифрові відбитки. Операції пошуку та видалення для фільтра зозулі прості. Існує максимум два місця і , які варто перевірити. Якщо елемент знайдено, відповідна операція пошуку або видалення може бути виконана за час . Більше теоретичного аналізу фільтрів зозулі можна знайти в літературі[3][4].

Порівняння з фільтрами Блума[ред. | ред. код]

Зозулин фільтр подібний до фільтра Блума тим, що вони обидва дуже швидкі та компактні, і обидва вони можуть повертати хибно позитивні результати:

  • Оптимальних по пам'яті фільтри Блума використовують біт місця для кожного вставленого ключа, де це коефіцієнт хибно позитивних результатів. Зозулиному фільтру необхідно де це коефіцієнт завантаження хеш-таблиці, який може бути на основі налаштувань зозулиного фільтра. Варто зазначити, що теоретична нижня межа об'єму пам'яті складає бітів для кожного елемента.
  • При позитивному пошуку оптимальний для пам'яті фільтр Блума вимагає константно операцій звернення до бітового масиву, тоді як зозулин фільтр потребує щонайбільше двох таких операції.
  • Після досягнення порогового значення навантаження швидкість вставки до фільтра зозулі може деградувати. В такому випадку рекомендується розширення таблиці. Навпроти, фільтри Блума можуть продовжувати вставляти нові елементи без розширення таблиці, але це можливо ціною отримання вищого рівня хибно позитивних результатів.

Обмеження[ред. | ред. код]

  • Зозулин фільтр може видаляти лише елементи, про які відомо, що вони були вставлені раніше.
  • Вставка може бути невдалою, в такому випадку хешування потрібно проводити наново. Варто зазначити, що амортизована складність вставки залишається . [5]

Посилання[ред. | ред. код]

  1. Michael D. Mitzenmacher. Bloom Filters, Cuckoo Hashing, Cuckoo Filters, Adaptive Cuckoo Filters, and Learned Bloom Filters. Архів оригіналу за 26 червня 2022. Процитовано 3 березня 2023.
  2. а б Fan, Bin; Andersen, Dave G.; Kaminsky, Michael; Mitzenmacher, Michael D. (2014). Cuckoo filter: Practically better than Bloom. Proc. 10th ACM International on Conference on Emerging Networking Experiments and Technologies (CoNEXT '14). Sydney, Australia. с. 75—88. doi:10.1145/2674005.2674994. ISBN 9781450332798.
  3. Eppstein, David (22 June 2016). Cuckoo filter: Simplification and analysis. Proc. 15th Scandinavian Symposium and Workshops on Algorithm Theory (SWAT 2016). Leibniz International Proceedings in Informatics (LIPIcs). Т. 53. Reykjavik, Iceland. с. 8:1–8:12. arXiv:1604.06067. doi:10.4230/LIPIcs.SWAT.2016.8.
  4. Fleming, Noah (17 May 2018). Cuckoo Hashing and Cuckoo Filters (PDF) (Технічний звіт). University of Toronto.
  5. Pagh, Rasmus; Rodler, Flemming Friche (2001). Cuckoo hashing. Proc. 9th Annual European Symposium on Algorithms (ESA 2001). Lecture Notes in Computer Science. Т. 2161. Århus, Denmark. с. 121—133. doi:10.1007/3-540-44676-1_10. ISBN 978-3-540-42493-2.