Mi favorito de todos los tiempos es el filtro Bloom. Me parece absolutamente místico, en el sentido de que en realidad nunca almacenamos los elementos como tales en él, pero aún podemos descubrir con una muy buena probabilidad, si tenemos ese elemento en nuestro filtro. En esencia, esto es análogo a darse cuenta de que ha visitado un lugar en su infancia, cuando visita ese lugar nuevamente. No tiene un recuerdo activo de eso, pero si lo visita nuevamente, esas células de memoria inactivas se activan nuevamente.
Lo que hace detrás de escena es usar menos espacio, a cambio de una pequeña probabilidad de falla.
¿Por qué son geniales?
Los filtros Bloom se usan para consultas de membresía aproximadas (AMQ), y generalmente se usan para evitar una búsqueda en una base de datos o lista, lo cual es relativamente costoso, ya que los filtros Bloom pueden responder estas consultas súper rápido con una pequeña posibilidad de un falso positivo (recuerde mantener la tasa de falsos positivos lo suficientemente baja). Por ejemplo, puede verificar si una publicación en el foro tiene palabras ofensivas, creando un filtro Bloom en un diccionario de las palabras que considere ofensivas y luego consultando el filtro Bloom en lugar de buscar la lista.
- Cómo implementar un árbol binario en Python
- ¿Qué idioma es mejor para los algoritmos de búsqueda: Java o Python? ¿Por qué?
- ¿Cómo convertirse en un experto en ciencia de datos (aprendizaje automático) que tiene una idea básica de la programación C / C ++? ¿Cuáles son algunos cursos o libros disponibles gratis o baratos?
- ¿Existe un libro que enseñe algoritmos, estructuras de datos y otros conceptos básicos de informática de una manera divertida?
- ¿Cuál es la mejor manera de implementar una lista cerrada para un algoritmo de búsqueda en C?
Una aplicación de la vida real
Una de las aplicaciones prácticas implica acortar URL. Bit.ly lo utiliza para generar URL cortas. Lo que hacen es crear primero un filtro Bloom en el conjunto de URL cortas existentes. Cuando necesitan generar una URL corta, simplemente crean una aleatoria y verifican si ya está presente en el filtro Bloom, en lugar de consultar una base de datos.
Existen varias otras aplicaciones en las áreas de Redes [0], Bioinformática, Desduplicación, etc.
Notas misceláneas
Es genial si el conjunto de elementos es estático. Simplemente puede arreglar el tamaño del filtro de floración de antemano, decidiendo su tasa de falsos positivos objetivo.
Sin embargo, si el filtro de floración está creciendo continuamente, es probable que en algún momento se quede sin espacio en su filtro. Para evitar esto, puede usar filtros de floración escalables, como se describe en un documento de Almeida, et al. [1] También he escrito una implementación más simple en Go. [2]
Si desea admitir eliminaciones, puede leer en Conteo de filtros de floración [3]. El filtro de cociente también es una estructura de datos AMQ, que es similar al filtro Bloom, pero permite la eliminación, así como la fusión y división de filtros. [4, 5]
[0] http://www.sciencedirect.com/sci…
[1] https://github.com/reddragon/blo…
[2] http://www.cs.utexas.edu/~yzhang…
[3] http://en.wikipedia.org/wiki/Blo…
[4] http://vldb.org/pvldb/vol5/p1627…
[5] http://en.wikipedia.org/wiki/Quo…