Filtr Bloom pozwala efektywnie śledzić, czy różne wartości zostały już napotkał podczas przetwarzania. Gdy jest wiele elementów danych, filtr Bloom może spowodować znaczne oszczędności pamięci w tabeli skrótów. Główną cechą filtra Bloom, który dzieli z tabelą skrótów, jest to, że zawsze mówi „nie nowy”, jeśli element nie jest nowy, ale istnieje niezerowe prawdopodobieństwo, że element zostanie oznaczony jako „nie nowy „nawet gdy jest nowy.
Czy istnieje „filtr przeciw Bloomowi”, który ma przeciwne zachowanie?
Innymi słowy: czy istnieje wydajna struktura danych, która mówi „nowy”, jeśli element jest nowy, ale który mógłby również powiedzieć „nowy” dla niektórych elementów, które nie są nowe?
Przechowywanie wszystkich wcześniej widocznych elementów (na przykład na posortowanej liście połączonej) spełnia pierwsze wymaganie, ale może zużywać dużo pamięci. Mam nadzieję, że jest to również zbędne, biorąc pod uwagę łagodny drugi wymóg.
Dla tych, którzy wolą bardziej formalne leczenie, napisz jeśli filtr Bloom myśli, że jest nowy, przeciwnym razie i napisz jeśli naprawdę jest nowy, a przeciwnym razie.
Następnie ; ; ; , dla niektórych .
Pytam: czy istnieje wydajna struktura danych, implementująca funkcję z pewnymi , tak że ; ; ; ? 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 ( xP r [ b ′ ( x ) = 1 | n ( x ) = 1 ] = 1
Edycja: Wygląda na to, że pytanie zostało zadane wcześniej na StackExchange, ponieważ /programming/635728 i /cstheory/6596 z szeregiem odpowiedzi od „nie można „do” można zrobić, za pewnym kosztem „do”, jest to trywialne, poprzez odwrócenie wartości ”. Nie jest jeszcze dla mnie jasne, jaka jest „właściwa” odpowiedź. Co jest jasne, że system buforowania LRU jakiegoś rodzaju (takie jak ten zaproponowany przez Ilmari Karonen) działa dość dobrze, jest łatwe do wykonania, a zakończyło się 50% redukcji czasu potrzebnego do uruchomienia mojego kodu.