Імовірнісний набір без помилкових позитивів?


35

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

Моя мотивація проста: враховуючи величезний потік предметів для обробки (з дублікатами), ми хотіли б уникати обробки предметів, які ми бачили раніше. Обробляти дублікат не завадить, це лише марна трата часу. Але, якби ми нехтували обробкою елемента, це було б катастрофічно. За допомогою "зворотного фільтра Блюма" можна було зберігати побачені предмети з невеликим накладними витратами, а також уникати обробки дублікатів з високою ймовірністю, перевіряючи приналежність до набору.

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

Хтось бачив щось подібне? :)


3
Доповнення набору, який мене цікавить, є нескінченним. Як би я його зберігав?
Крістофер Монсанто

11
Я бачу проблему (сучасні диски ще недостатньо великі).
Дейв Кларк

8
Якщо у вас була така структура даних, ви можете використовувати її для "обману", використовуючи її разом із звичайним фільтром цвітіння та зберігаючи точно встановлене членство.
Марк Рейтблат

1
@MarkReitblatt і фільтри Bloom, і кеші є імовірнісними, і будь-яка їх комбінація буде імовірнісною, тобто не зможе досягти точного встановленого тестування членства. :)
awdz9nld

Відповіді:


25

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


Дякую за відповідь. Так, це очевидне рішення - якщо це також стандартне рішення, це здається, що мені не пощастило. Ну добре.
Крістофер Монсанто

2
Це називається кеш-прямим відображенням і зазвичай використовується в процесорах. (Будь-який кеш або втрачений хеш-набір у різному ступені відповідає вимогам). Коефіцієнт помилок - це функція розподілу хеш-функції (лавина) та кількості доступних слотів у кеші / наборі - відповідно регулюйте. :)
awdz9nld

Також зауважте, що лише дослівні ключі можуть зберігатися без введення помилкових позитивів (наприклад, зберігання
хешованого

20

Відповідь на це питання - «ні». Щоб зрозуміти, чому, ми можемо подумати про надзвичайний випадок, і як працював звичайний фільтр цвітіння, порівняно з теоретичним фільтром цвітіння "Світ Bizzaro", який ми можемо назвати "похмурим фільтром".

Що стосується фільтра цвітіння, це те, що ви можете робити однобічні тести на приналежність елементів (з помилковими позитивами), використовуючи структуру даних, яка має фіксований розмір щодо ймовірності помилки та кількості елементів, що зберігаються. У розмірах цих елементів самі по собі не мають значення. Наприклад, якби у нас був фільтр цвітіння, встановлений для зберігання до 1000 предметів з помилкою менше 3%, то ми могли б зберігати 1000 трохи різних версій всього корпусу Вікіпедії, з однією буквою, зміненою в кожній, і ми все одно отримуємо потрібні нам показники, і структура даних була б дуже крихітною (менше кілобайт). Звичайно, обчислення цих хешей буде складним завданням, але принцип все-таки дотримується.

А тепер подумайте про збереження тих самих масивних рядків у похмурому фільтрі! Зараз ми можемо мати лише помилкові негативи. Тож якщо ми скажемо "так, ця версія всього корпусу Вікіпедії є в цьому наборі", то ми маємо бути абсолютно в цьому відношенні. Це означає, що хешування не допоможе нам, оскільки завжди буде якийсь інший рядок, який хеширує однакове значення. Єдиний спосіб сказати "так" і бути впевненим - це збереження цілого рядка або деяких еквівалентних даних однакової довжини. Ми завжди не могли його зберігати і сказати «ні», але з часом рівень помилок нас наздожене. Найкраще, що ми могли зробити, - це стиснення, зменшення розміру структури до продукту ентропії збережених даних та бажаної точності.

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



@Yehosef це добре і може працювати для ваших потреб, але ви помітите, що автор говорить про те, що існує "кілька ідентифікаторів, які повністю ідентифікують подію". Отже, те, що реалізовується, фактично все ще зберігає весь об’єкт. Отже, це варіант кешу. Справжня "протилежність фільтру цвітіння", якби вона існувала, не потрібно було б зберігати цілі об'єкти.
pents90

Він згадав кілька ідентифікаторів, які ідентифікують подію - не весь об’єкт. Мені просто потрібно зберегти "кеш" на session_id - не весь запис взаємодії. Але я чую, що це не такий тип підходу, як цвітіння або гіперлог.
Yehosef

У своєму "доказі" ви припускаєте, що існує необмежена кількість можливих записів. Однак бувають випадки, коли набір можливих записів відомий заздалегідь. Наприклад, для збирання сміття на сторінці пам'яті: ви знаєте, які записи вона містить. Тепер ви створюєте "похмурий фільтр", який відображає кожен можливий запис до індексу 0..n. Тепер, коли запис видалено, встановіть біт цього індексу. Коли всі біти встановлені, ви можете зібрати сторінку зі сміттям. "Похмурий фільтр" - це MPHF. Щоб дозволити помилкові негативи, змініть MPHF таким чином, щоб деякі записи були відображені на n + 1.
Томас Мюллер

@ThomasMueller Правильно, я припускаю найгірший / змагальний випадок, який є стандартною точкою зору теорії CS. Це правда, що якщо у вас є лише фіксований набір з N можливих записів, то існує безліч простих рішень, для кожного елемента потрібний лише простір журналу N. Однак фільтр цвітіння не має таких обмежень.
pents90

13

Ви просто хочете кеш , але думаєте про це дивним чином.


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

1
(продовження) Враховуючи це, я можу забути про очевидну техніку кешування, яка вирішує всі мої проблеми. У такому випадку ви могли б чітко вказати цю техніку замість того, щоб давати мені посилання на загальну категорію у Вікіпедії?
Крістофер Монсанто

2

ВІДПОВІДАЛЬНІСТЬ: Я не знавець кеш-пам'яті, тому це може бути наївною ідеєю, а також може бути відомою ідеєю, про яку я ніколи раніше не чув. Тож вибачте, якщо я не процитую його посилання (якщо воно існує); і, будь ласка, повідомте мене, чи є посилання на нього, щоб відредагувати публікацію та додати її. (Я підозрюю, що це може мати посилання, оскільки це так інтуїтивно).

cc


0

Я використовував дерева AVL (а іноді і червоно-чорні) з частковими елементами, щоб діяти як фільтр без помилкових негативів. Використовуйте лише перші X байти елемента, вставляючи або запитуючи дерево. Оскільки структура даних не є імовірнісною за формою, не існує ризику помилково-позитивного при бітовому зіткненні. І на відміну від кешування всього елемента, такий підхід дає вам максимально можливий простір. Ви можете налаштувати швидкість помилкових позитивів, розглядаючи різні довжини префікса / глибини дерева порівняно з вартістю помилкових позитивів та місцями.


Я також хотів пробувати спроби з рядковими даними, але мої дані мають тенденцію бути упакованими бінарними структурами.
JRideout

0

Я думаю, що можна довести нижню межу, заявивши, що вищезазначена структура даних не може існувати. В основному, якщо структура даних використовує m біт, то фіксований бітовий вектор (подання вводу) може відповідати максимум (((un) + n eps) \ select (un)) наборам аргументом підрахунку. Враховуючи, що 2 ^ m разів це число повинно бути принаймні (u \ select n) (усі множини повинні бути представлені), ми отримуємо нижню межу, яка в основному дуже близька до точного зберігання множини S.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.