Bloom фільтр дозволяє ефективно відслідковувати чи вже зустрічалися різні значення в процесі обробки. Коли є багато елементів даних, тоді фільтр Bloom може призвести до значного збереження пам'яті в хеш-таблиці. Головною особливістю фільтра Bloom, який він ділиться з хеш-таблицею, є те, що він завжди говорить "не новий", якщо елемент не новий, але існує ненульова ймовірність того, що елемент буде позначено як "не новий "навіть коли це нове.
Чи є "фільтр" проти цвітіння ", який має протилежну поведінку?
Іншими словами: чи існує ефективна структура даних, яка говорить "нове", якщо елемент є новою, але яка може також сказати "нова" для деяких елементів, які не є новими?
Якщо зберігати всі раніше переглянуті предмети (наприклад, у відсортованому зв'язаному списку), задовольняє першу вимогу, але може використовуватися багато пам'яті. Я сподіваюся, що це також непотрібно, враховуючи невимушену другу вимогу.
Для тих, хто вважає за краще формальне лікування, напишіть якщо фільтр Bloom вважає, що є новим, іншому випадку, і напишіть якщо дійсно є новим і інакше.b ( x ) = 0 n ( x ) = 1 x n ( x ) = 0
Тоді ; ; ; , для деяких .P r [ b ( x ) = 0 | n ( x ) = 1 ] = α P r [ b ( x ) = 1 | n ( x ) = 0 ] = 0 P r [ b0 < α < 1
Я запитую: чи існує ефективна структура даних, реалізуючи функцію з деяким , таким, що ; ; ; ? 0 < β < 1 P r [ b ′ ( x ) = 0 | n ( x ) = 0 ] = β P r [ b ′ ( x ) = 0 | n ( x ) = 1 ] = 0 P r [ b ′ ( x ) = 1 | n ( x
Редагувати: Схоже, це питання було задано раніше на StackExchange, як /programming/635728 та /cstheory/6596 з діапазоном відповідей від "не може бути "через" можна зробити, за деяку ціну "до" це тривіально зробити, перевернувши значення ". Мені поки не ясно, що таке "правильна" відповідь. Що це ясно, що схема кешування LRU деякого виду (наприклад, один запропонований Ілмарі Karonen) працює досить добре, легко реалізувати, і призвело до скорочення часу , необхідного для запуску мого коду на 50%.