Portanto, os filtros Bloom são bem legais - são conjuntos que suportam a verificação de associação sem falsos negativos, mas com uma pequena chance de um falso positivo. Recentemente, porém, eu estava querendo um "filtro Bloom" que garanta o contrário: sem falsos positivos, mas potencialmente falsos negativos.
Minha motivação é simples: dado um grande fluxo de itens a serem processados (com duplicatas), gostaríamos de evitar o processamento de itens que já vimos antes. Não custa processar uma duplicata, é apenas uma perda de tempo. No entanto, se deixássemos de processar um elemento, seria catastrófico. Com um "filtro Bloom reverso", era possível armazenar os itens vistos com pouco espaço e evitar o processamento de duplicatas com alta probabilidade, testando a associação ao conjunto.
No entanto, parece que não consigo encontrar nada disso. Os mais próximos que encontrei são os " filtros Bloom retocados ", que permitem trocar falsos positivos selecionados por uma taxa de falsos negativos mais altos. No entanto, não sei o desempenho da estrutura de dados quando se deseja remover todos os falsos positivos.
Alguém viu algo assim? :)
fonte
Respostas:
Uma resposta é usar uma grande tabela de hash e, quando preenchida, comece a substituir elementos nela, em vez de encontrar slots vazios (inexistentes) em outros lugares para eles. Você não obtém a boa taxa fixa de respostas falsas que obtém com os filtros Bloom, mas é melhor que nada. Acredito que isso seja padrão, por exemplo, no software de xadrez para acompanhar as posições que já foram pesquisadas.
fonte
A resposta para esta pergunta é não". Para entender por que, podemos pensar em um caso muito extremo e como um filtro de bloom normal funcionaria em comparação com um filtro de bloom "Bizzaro World" teórico, que podemos chamar de "filtro de melancolia".
O que é ótimo em um filtro de bloom é que você pode fazer testes unilaterais para associação de itens (com falsos positivos) usando uma estrutura de dados que possui um tamanho fixo em relação à probabilidade de erro e ao número de itens armazenados. Os tamanhos dos itens em si não importam nada. Por exemplo, se tivéssemos um filtro de bloom configurado para armazenar até 1.000 itens com menos de 3% de erro, poderíamos armazenar 1.000 versões ligeiramente diferentes de todo o corpus da Wikipedia, com uma letra alterada em cada uma, e ainda assim obtenha as métricas desejadas e a estrutura de dados seria muito pequena (menos de um kilobyte). Obviamente, calcular esses hashes será um desafio, mas o princípio ainda é válido.
Agora, considere armazenar essas mesmas cordas enormes em um filtro sombrio! Agora só podemos ter falsos negativos. Portanto, se dissermos "sim, essa versão de todo o corpus da Wikipedia está nesse conjunto", então temos que estar absolutamente certos sobre isso. Isso significa que o hash não nos ajudará, pois sempre haverá outras strings com o mesmo valor. A única maneira de dizer "sim" e não se esqueça de armazenar toda a string ou alguns dados equivalentes do mesmo comprimento. Nem sempre conseguimos armazená-lo e dizer "não", mas, eventualmente, a taxa de erro nos alcança. O melhor que podemos fazer é a compactação, diminuindo o tamanho da estrutura até o produto da entropia dos dados armazenados e a precisão que desejamos.
Infelizmente, o filtro sombrio não existe. O armazenamento em cache é a única solução, mas não é exatamente o oposto de um filtro de bloom, pois seu tamanho será proporcional ao produto da quantidade de informações armazenadas e à taxa de precisão desejada do filtro. Obviamente, em muitos cenários do mundo real, grandes dados podem ser representados por um ID, portanto o armazenamento em cache ainda pode ser bastante aceitável. Mas é fundamentalmente diferente do poderoso filtro de floração.
fonte
Você só quer um cache , mas está pensando nisso de uma maneira estranha.
fonte
AVISO LEGAL: Eu não sou especialista em caches, então essa pode ser uma idéia ingênua, e também pode ser uma ideia conhecida da qual nunca ouvi falar antes. Então, desculpe-me se eu deixar de citar sua referência (se ela existir); e informe-me se houver uma referência para editar a postagem e adicioná-la. (Eu suspeito que ele possa ter uma referência porque é muito intuitivo).
fonte
Eu usei árvores AVL (e às vezes vermelho-preto) com itens parciais para atuar como um filtro sem negativos negativos. Use apenas os primeiros X bytes do item ao inserir ou consultar a árvore. Como a estrutura de dados não é probabilística em forma, não há o risco de um falso positivo por colisão de bits. E, diferentemente do armazenamento em cache de todo o item, essa abordagem fornece um espaço máximo calculável. Você pode ajustar a taxa de falsos positivos considerando diferentes comprimentos de prefixo / profundidade de árvore em comparação com o custo de falsos positivos e espaço.
fonte
Eu acho que se pode provar um limite inferior afirmando que a estrutura de dados acima não pode existir. Basicamente, se a estrutura de dados usa m bits, um vetor de bits fixo (representação de uma entrada) pode corresponder a no máximo (((un) + n eps) \ escolher (un)) conjuntos por um argumento de contagem. Dado que 2 ^ m vezes esse número deve ser pelo menos (u \ escolha n) (todos os conjuntos devem ser representados), obtemos um limite inferior que está basicamente muito próximo de armazenar o conjunto S com precisão.
fonte