Un filtro Bloom consente di tenere traccia in modo efficiente se durante l'elaborazione sono già stati rilevati vari valori. Quando sono presenti molti elementi di dati, un filtro Bloom può comportare un notevole risparmio di memoria su una tabella hash. La caratteristica principale di un filtro Bloom, che condivide con una tabella hash, è che dice sempre "non nuovo" se un oggetto non è nuovo, ma c'è una probabilità diversa da zero che un oggetto sia contrassegnato come "non nuovo "anche quando è nuovo.
Esiste un "filtro anti-Bloom", che ha il comportamento opposto?
In altre parole: esiste una struttura dati efficiente che dice "nuovo" se un articolo è nuovo, ma che potrebbe anche dire "nuovo" per alcuni articoli che non sono nuovi?
Mantenere tutti gli elementi precedentemente visualizzati (ad esempio, in un elenco collegato ordinato) soddisfa il primo requisito ma può utilizzare molta memoria. Spero anche che non sia necessario, dato il secondo requisito rilassato.
Per coloro che preferiscono un trattamento più formale, scrivi se il filtro Bloom pensa che sia nuovo, altrimenti, e scrivi se è davvero nuovo e altrimenti.
Quindi ; ; ; P r [ b ( x ) = 1 | n ( x ) = 1 ] = 1 - α , per alcuni 0 < α < 1 .P r [ b ( x ) = 0 | n ( x ) = 1 ] = α P r [ b ( x ) = 1 | n ( x ) = 0 ] = 0
Sto chiedendo: esiste una struttura dati efficiente, implementando una funzione con qualche , tale che ; ; ; ?P r [ b ′ ( x ) = 1 | n ( x ) = 1 ] = 1
Modifica: sembra che questa domanda sia stata posta in precedenza su StackExchange, come /programming/635728 e /cstheory/6596 con una gamma di risposte da "impossibile essere fatto "attraverso" può essere fatto, ad un certo costo "a" è banale da fare, invertendo i valori di ". Non mi è ancora chiaro quale sia la risposta "giusta". Ciò che è chiaro è che uno schema di memorizzazione nella cache LRU di qualche tipo (come quello suggerito da Ilmari Karonen) funziona piuttosto bene, è facile da implementare e ha comportato una riduzione del 50% del tempo impiegato per eseguire il mio codice.