Um filtro Bloom usa uma função de hash para testar a associação em um determinado conjunto , verificando se um item está presente ou não na posição especificada.
Para mitigar o efeito da colisão de hash, várias funções são usadas, produzindo um limite probabilístico se o hash universal for usado.
Podemos usar 10 bits por elementos para ter uma taxa de erro 'razoável'.
Se pudéssemos criar diretamente uma função hash perfeita para o conjunto , onde o último elemento não está presente em , poderíamos usar apenas 1 bit por elemento e obter uma recuperação perfeita.
Quais são as razões fundamentais pelas quais esse raciocínio está errado?
Respostas:
Eu acho que seu raciocínio está em princípio correto. O hash perfeito é uma alternativa aos filtros Bloom. Entretanto, o hashing perfeito dinâmico clássico é mais um resultado teórico do que uma solução prática. O hash do cuco é provavelmente a alternativa mais "razoável".
Observe que o desempenho do hashing perfeito dinâmico e do hashing cuco padrão é esperado apenas amortizado (talvez seja necessário reconstruir a estrutura de dados completamente de tempos em tempos). Também o filtro Bloom é mais fácil de implementar. Isso pode ser argumentos para usar um filtro Bloom, especialmente se você pode viver com falsos positivos.
fonte
Acho que o filtro Bloom oferece algo que a função hash perfeita não oferece - ele pode testar a associação.
Os PHFs que conheço retornam alguma resposta para qualquer chave à qual você os aplica. Se a chave que você forneceu não estiver no seu conjunto de hash, algum valor ainda será fornecido. Isso é bom se você estiver armazenando todas as teclas que estão no seu conjunto em algum lugar e o PHF fornecer apenas um ponteiro, ou se você estiver usando apenas o PHF para procurar dados de satélite do tamanho nas teclas que encontrar. saber estar em sua estrutura. No entanto, o teste de associação é mais difícil.O(1)
Em particular, armazenar elementos distintos sem erro requer bits de armazenamento.n nlog2n
fonte