Qué es el Bloom 필터?
6043 단어 gotutorialprogrammingalgorithms
Con esto en mente, tenemos que saber que es una estructura probabilística, con dos resultados posibles, estos son:
Si nos dice que no, es que no está y eso es seguro, pero no puede garantizar que sí, entonces si la respuesta es probablemente si vamos a tener que asegurarnos yendo a verificar por segunda vez, pero a otro lugar, no al filtro. Esto se puede dar por colisiones en funciones hash y también en que, al reducer el espacio en memoria, las collisones van a estar presentes.
Ahora vemos como funciona
Hablamos de probabilidades, hashes, colisiones y demás, vamos a explicar con un caso concreto.
Supongamos que no quiere recomendarte un post que ya leíste en el ultimo tiempo, entonces, vamos a ir cargando los posts vistos en el filtro de una manera specific, que ahora detallamos.
Para nuestro filtro vamos a usar un arreglo (slice si sos gopher) con un numero que sepamos, en este caso 100, así no crece indiscriminadamente porque la idea principal es mantener nuestro uso de memoria, bajo. Usamos bool para는 0 y 1을 나타냅니다.
Cada función de hash (podemos usar varias, recomiendo fuertemente más de una) va a devolver un numero entero como resultado y cada entrada va a ser Representative por n números siendo n la cantidad de hash que usemos. Después todos los resultados van a traducirse en que ese mismo indice, va a quedar en true. Por ejemplo si tenemos un slice de 10 de bool y las tres funciones nos devuelven 2, 3 y 6 nos queda algo así:
[f][f][✅][✅][f][f][✅][f][f][f]
엔톤스...
var filter [100] bool //100 para tener una buena distribución
Ahora las funciones 해시
var h1 = func(i interface{}) int{...}
var h2 = func(i interface{}) int{...}
var h3 = func(i interface{}) int{...}
Si bien son placeholders, la idea es que tome cualquier valor y devuelva un entero que esté dentro del rango, por eso vamos a aplicar el operator modulo a la respuesta. Cualquier implementación que usemos, tenemos que saber que el resultado tiene que ser siempre el mismo ante la misma entrada, como una función pura y determinística.
index1 := h1("dev.to/post-x") % 100
index2 := h2("dev.to/post-y") % 100
index3 := h3("dev.to/post-z") % 100
filter[index1] = true
filter[index2] = true
filter[index3] = true
De esta manera ya queda resuelto como podemos escribir un bloom filter, para la lectura, básicamente es lo mismo, pero debemos preguntar si los indices son
true
y ahi tenemos cómo podemos estudiar las respuestas que vimos previamente.Si algún indice nos da falso, sabemos que la URL que enviamos no esta en nuestro filtro.
Si todos los indices dan verdadero, decimos que probablemente si, ya que, al tener un array "chico"y que las funciones hash tienen collisones, puede que otra URL haya generado los mismos números o algo mas fácil, puede ser este ejemplo:
La url 1 nos da el resultado 1, 3 y 6
La url 2 nos da el resultado 2, 5 y 7
la url 3 nos da el resultado 2, 3 y 7 -> nos da que sí son todos true, pero la url 3 en sí, no estaba guardada, por eso en el segundo check (puede ser una base de datos) nos da que 아니 에스타바.
결론
El bloom filter es una buena opción para cuando queremos ahorrar tiempo y espacio. 캐시에서 해시맵으로 변경하는 방법을 사용하면 메모리에서 작업을 수행하고 빨간색으로 제거할 수 있습니다. Espero que lo prueben en sus proyectos!
이제 곧!
추신: sponsoreame aca si te gusto el contenido
Reference
이 문제에 관하여(Qué es el Bloom 필터?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tomaslingotti/que-es-el-bloom-filter-4ddm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)