Estructura de datos: filtro Bloom

Tabla de contenido

1. Antecedentes

2. Consultar si existe una cadena a partir de datos masivos

2.1, use conjunto y mapa

2.2 、 mapa_desordenado

2.3. Resumen

3. Filtro de floración

3.1 Principio

3,2, tasa de falsos positivos


​​​​​​​

1. Antecedentes

  • Al usar documentos de Word, ¿cómo juzga una palabra si una palabra está escrita correctamente?

  • El programa de rastreo de red, ¿cómo puedo evitar que rastree la misma página de URL? Error permitido

  • ¿Cómo diseñar un algoritmo de filtrado de spam (SMS)? Error permitido

  • Al manejar un caso, ¿cómo juzga la policía si un sospechoso está en la lista de escape? Error de control tasa de falsos positivos

  • ¿Cómo solucionar el problema de la penetración de la caché? Error permitido

1. Pasos de lectura:

    1) Visite redis primero, si existe, regrese directamente; si no existe, vaya 2;

    2) Visite mysql, si no existe, regrese directamente, si existe, vaya al 3;

    3) Escriba la clave que existe en mysql de nuevo en redis; 

2. Penetración de caché:

Los piratas informáticos solicitan con frecuencia datos que no están disponibles en redis o mysql, lo que provoca una presión excesiva sobre mysql y todo el sistema se paralizará.

3. Solución:

    1) Establezca el par clave-valor <clave, nulo> en el lado de redis para evitar el acceso frecuente a mysql; la desventaja es que si hay demasiadas <clave, nulo>, ocupará demasiada memoria; ( el < clave, nulo> par clave-valor en el lado de redis puede Establecer el tiempo de vencimiento, por ejemplo, establecer el tiempo de vencimiento en 500 ms. Incluso si lo solicita con frecuencia, solo interactuará con redis con frecuencia, y solo puede solicitar mysql una vez en 500 ms )

    2) Almacene un filtro de floración en el lado del servidor y coloque la clave contenida en mysql en el filtro de floración; el filtro de floración puede filtrar datos que no deben existir;

2. Consultar si existe una cadena a partir de datos masivos

2.1, use conjunto y mapa

Las estructuras de conjuntos y mapas en la biblioteca estándar de C ++ (STL) se implementan utilizando árboles rojo-negro, y la complejidad de tiempo de agregar, eliminar, modificar y verificar es O ( log_ {2} n)

  • Para el árbol de búsqueda binaria (AVL) estrictamente equilibrado, un árbol rojo-negro compuesto por 100w piezas de datos. Solo es necesario comparar 20 veces como máximo para encontrar el valor; para mil millones de datos, solo necesita comparar 30 veces como máximo para encontrar los datos; es decir, el número de búsquedas es igual a la altura del árbol;
  • Para los árboles rojo-negro, el equilibrio es la altura de los nodos negros, por lo que la diferencia de altura del árbol debe tenerse en cuenta para el número de estudios. El mejor caso es que un enlace de árbol son todos los nodos negros. Suponga que la altura es h1 en este momento, y el peor de los casos es una cadena. El camino es todos intervalos de nodos negros y rojos, en este momento la altura del árbol es 2 * h1;
  • En el árbol rojo-negro, cada nodo almacena los campos clave y val, y la clave es el campo utilizado para la comparación; el árbol rojo-negro no requiere que el campo clave sea único y el campo clave está restringido en el conjunto y proceso de implementación del mapa. Veamos la implementación del árbol rojo-negro de nginx:

Dirección del código fuente de Nginx: http://hg.nginx.org/nginx/file

La posición de implementación de ngx_rbtree_insert_value en nginx

//insert操作中的一部分,执行完这个函数还需要检测插入节点后是否平衡(主要看他的父节点是否也是红色节点)
//temp:红黑树的根节点;node:待插入的节点  
void
ngx_rbtree_insert_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,
    ngx_rbtree_node_t *sentinel)
{
    ngx_rbtree_node_t  **p;

    for ( ;; ) {

        p = (node->key < temp->key) ? &temp->left : &temp->right;

        if (*p == sentinel) {
            break;
        }

        temp = *p;
    }

    *p = node;
    node->parent = temp;
    node->left = sentinel;
    node->right = sentinel;
    ngx_rbt_red(node);
}

2.2 、 mapa_desordenado

unordered_map se implementa mediante Hashtable .

Ventajas: velocidad de acceso más rápida, sin necesidad de comparar cadenas;

Desventajas: Necesidad de introducir estrategias para evitar conflictos, la eficiencia del almacenamiento no es alta, se intercambia espacio por tiempo.

2.3. Resumen

Ni el árbol rojo ni la tabla hash pueden resolver el problema de los datos masivos. Ambos necesitan almacenar cadenas específicas. Si la cantidad de datos es grande, no pueden proporcionar cientos de gigabytes de memoria; por lo tanto, es necesario intentar explorar soluciones que sí lo hagan. no almacenar claves y tener las ventajas de la tabla hash (no es necesario comparar cadenas);

3. Filtro de floración

3.1 Principio

El filtro Bloom es una especie de estructura de datos, una estructura de datos probabilística más inteligente, que se caracteriza por una inserción o consulta eficiente, y puede usarse para decirle " algo no debe existir o puede existir ".

En comparación con las estructuras tradicionales de lista, conjunto, mapa y otras estructuras de datos, es más eficiente y ocupa menos espacio, pero la desventaja es que no devuelve un valor determinado, sino un resultado probabilístico.

Primero describamos visualmente cuál es la estructura de datos del filtro Bloom

El principio del filtro Bloom es que cuando se agrega un elemento al conjunto, el elemento se asigna a K puntos en una matriz de bits a través de la función clave Hash, y se establecen en 1. Al recuperar, solo necesitamos ver si estos puntos son todos 1 para (aproximadamente) saber si lo hay en el conjunto:

  • Si hay 0 en estos puntos, el elemento detectado no debe existir;
  • Si ambos son 1, entonces el elemento detectado puede existir (se puede establecer la probabilidad que esperamos que exista).

Suponga que hay tres funciones Hash para diseñar este filtro Bloom

Hash1 (" bytedance ") = 0; Hash2 (" bytedance ") = 3; Hash3 (" bytedance ") = 8;

Hash1 (" diezcent ") = 1; Hash2 (" diezcent ") = 3; Hash3 (" diezcent ") = 5;

Al buscar " bytedance " , los tres puntos se calculan mediante hash para que sean 0 , 3 y 8 , y luego las posiciones de 0 , 3 y 8 son todas 1, y el filtro Bloom nos dice que puede existir " bytedance " .

Y si queremos recuperar el valor " huawei " en este momento, el valor hash calculado es 3 , 5 , 8 . En este momento, el filtro Bloom nos dice que huawei” puede existir, pero de hecho huawei no existe en absoluto (tasa de falsos positivos, falso positivo), y esta es la desventaja del filtro Bloom.

El filtro Bloom no admite la eliminación, porque cada ranura en el mapa de bits tiene solo dos estados (0 o 1). Si una ranura se establece en 1 estado, no está claro cuántas veces se ha configurado; es decir, no t saber cuántos hashes se asignan y qué función de hash se asigna; por lo tanto, la operación de eliminación no es compatible;

3,2, tasa de falsos positivos

El filtro Bloom definitivamente no puede existir, pero no puede existir definitivamente, entonces el juicio de existencia es incorrecto y la tasa de falsos positivos es la probabilidad de la existencia de un juicio incorrecto.

n -- 布隆过滤器中元素的个数,如上图 只有"tencent"和"bytedance"两个元素 那么 n=2
p -- 假阳率,在0-1之间 0.000000
m -- 位图所占空间
k -- hash函数的个数
公式如下:
n = ceil(m / (-k / log(1 - exp(log(p) / k))))
p = pow(1 - exp(-k / (m / n)), k)
m = ceil((n * log(p)) / log(1 / pow(2, log(2))));
k = round((m / n) * log(2));

/*
round:四舍五入

ceil:向上取整

exp:以e为底的指数

pow:次方
*/

En aplicaciones reales, determinamos nyp, y calculamos myk mediante los cálculos anteriores; también puede seleccionar los valores apropiados en el siguiente sitio web  https://hur.st/bloomfilter/

La tasa de falsos positivos p aumenta abruptamente después de que el número de elementos n aumenta a 823 

 

La tasa de falsos positivos p es inversamente proporcional al tamaño del espacio de mapa de bits m. Cuanto mayor sea el espacio, menor será la probabilidad de conflicto.

 

Se puede ver en esta imagen que cuanto más se usa la función hash, menor es la tasa de falsos positivos y hay una solución óptima. Después de ese valor, la tasa de falsos positivos comenzará a aumentar nuevamente. De hecho, es fácil comprender que cuantas más funciones hash tenga, más bits se almacenará en un valor y se establecerá en 1. Cuando el número de funciones hash exceda un cierto valor crítico, los conflictos aumentarán significativamente.

Supongo que te gusta

Origin blog.csdn.net/weixin_40179091/article/details/112521477
Recomendado
Clasificación