Bloom фильтр позволяет эффективно отслеживать ли уже встречались различные значения в процессе обработки. Когда имеется много элементов данных, тогда фильтр Блума может привести к значительной экономии памяти по хеш-таблице. Основная особенность фильтра Блума, который он разделяет с хеш-таблицей, заключается в том, что он всегда говорит «не новый», если элемент не новый, но существует ненулевая вероятность того, что элемент будет помечен как «не новый». «даже когда это новое.
Есть ли «анти-Блум фильтр», который имеет противоположное поведение?
Другими словами: существует ли эффективная структура данных, которая говорит «новый», если элемент новый, но который может также сказать «новый» для некоторых элементов, которые не являются новыми?
Сохранение всех ранее просмотренных элементов (например, в отсортированном связанном списке) удовлетворяет первому требованию, но может занимать много памяти. Я надеюсь, что это также не нужно, учитывая ослабленное второе требование.
Для тех, кто предпочитает более формальный подход, напишите если фильтр Блума считает, что является новым, противном случае, и напишите если действительно новый и противном случае.
Тогда ; ; ; , для некоторых .
Я спрашиваю: существует ли эффективная структура данных, реализующая функцию с некоторыми , такими, что ; ; ; ?P r [ b ′ ( x ) = 1 | n ( x ) = 1 ] = 1
Изменить: Кажется, этот вопрос уже задавался ранее в StackExchange, так как /programming/635728 и /cstheory/6596 с диапазоном ответов от «не может быть» Выполнение «через» может быть выполнено, за определенную плату «до« это тривиально, путем изменения значения ». Мне пока не ясно, каков «правильный» ответ. Что это ясно, что схема кэширования LRU некоторого вида (например, один предложенный Илмари Karonen) работает довольно хорошо, легко реализовать, и привело к сокращению времени , необходимого для запуска моего кода на 50%.